从 iframe 的代码隐藏访问父控件



所以我对非mvc web开发很陌生,而且我对iFrame有问题。

在我的主页中,我有一个复选框,它通过jQuery显示和隐藏iframe。在iFrame的codeehind中,我有一个方法loadStuff(),只有当iFrame可见时,我才想运行它。也就是说,我不想只把它放在page_load中,因为如果我这样做了,它会在每次刷新主页时尝试并运行。

所以我想我应该检查一下主窗口中的复选框是否被选中,如果是,运行loadStuff()方法。

问题是,我不知道如何从iFrame的代码绑定中访问该复选框。似乎this.Parent.FindControls()的某些变体会起作用,但我对此没有任何运气。

以下是我的一小部分:

主页(我们称之为mainpage.aspx):

<input type="checkbox" id="showIFrame" onclick="if(this.Clicked) $('#iframe').show(); else $('#iframe').hide();" />
//...
<div id="iframe" style="display:none;">
<iframe runat="server" id="iframeNetSheet" .../></iframe>
</div>

因此,当单击该复选框时,将显示iFrame。这时我想调用加载函数。到目前为止,它在iFrame的page_load中,每次加载父页面时都会命中它。

有人能给我指对方向吗?

如果页面上有IFrame,并且该页面被刷新,iFrame也将被刷新(每次)。因此,我看不出有任何理由选中父页面复选框值
此外,不只是设置iframe的可见性(如果设置为visible且srcurl为空),还可以设置src,并且只有在选中复选框时才会加载帧(并调用loadStuff())
代码看起来像这样:

<input type="checkbox" id="showIFrame" onclick="SetFrame(this.checked);" />
function SetFrame(isChecked)
{
if(isChecked) 
{
$('#iframe').show(); 
var iframeNetSheet = $('#iframeNetSheet');
if(iframeNetSheet.attr("src") == "")
iframeNetSheet.attr("src", "SomeUrl"); //This will invoke page_load on iframe.
}
else 
$('#iframe').hide();
}

在代码中,默认情况下将框架的srcurl保留为空。(只允许由脚本设置)

我建议您先将iFramesrc设置为"about:black",然后在单击复选框时设置正确的源。像这样的。。。

<script type="javascript">
$(document).ready(function() {
$("#showIFrame").click(function() {
var frame = $("#iframeNetSheet");
if ($("#showIFrame").prop("checked")) {
frame.show();
if (frame.prop("src") == "about:blank") {
frame.attr("src", "newpage.aspx");
}
} else {
frame.hide();
}
});
});
</script>
<input type="checkbox" id="showIFrame" />
<iframe runat="server" id="iframeNetSheet" style="display:none;"/></iframe>

实时JSFiddle演示

(在做了所有这些之后,因为我对jQuery没有100%的信心——我意识到这几乎正是马格努斯从一开始就说的)

编辑:正如Marcus善意地指出的,没有必要将src重置回"about:black",因此相应地更新了代码(并提高了效率)。

最新更新