我要感谢人们的回应。我没有在 OP 中包含任何代码,因为它是一个广泛的脚本,并且解析出我正在尝试做的事情的“示例”,以便通过它不会太乏味可能会消除任何相关性。
我正在发布,但是要说我确实发现了问题。
我有一个包含一个 IFrame 的 PageA,该 IFrame 又与 PageB 一起加载。
<html>
<head><title>PageA</title></head>
<body>
<IFrame src="PageB" name="frame1" id="frame1"></IFrame>
</body>
</html>
PageB 包含一个在单击按钮时需要从 PageA 调用的函数。
<!-- PageB -->
<html>
<head><title>PageB</title></head>
<body>
<form id="form1" name="form1" >
</form>
<script>
var SubmitForm = function(){
var $form = $("form[id$='form1']");
$form[0].submit(); // this was not firing
console.log("some log output"); // this was throwing an error
};
</script>
</body>
</html>
<!-- PageA -->
<html>
<head><title>PageA</title></head>
<body>
<IFrame src="PageB" name="frame1" id="frame1"></IFrame>
<button onclick="submitIFrameForm()">Submit</button>
<script>
var frameWindow = frames["frame1"];
var frameForm = frameWindow.SubmitForm;
function submitIFrameForm(){
frameForm();
};
</script>
</body>
</html>
问题
当 PageA首次加载时,IFrame 与 PageB 一起加载,并且 PageA 中的脚本使其成为 PageB 上“SubmItForm()”函数的引用 (frameForm)。当我单击 PageA 中的提交表单按钮时,PageB 被提交回服务器。没问题 ...
但是,当提交 PageB 时,它会从窗口中卸载。因此,当我第二次单击 PageA 中的提交按钮时,虽然 PageB 可能会重新加载,但它是页面的不同实例。因此,所有引用原始 PageB 的变量现在都没有指向任何东西......因此控制台引用的窗口不再存在,因此“日志”方法无法运行。
修复
我们必须在每次单击按钮时重新建立对函数的引用,而不是创建对 IFrame 内容的全局引用。(由于 IFrame 是 PageA 的成员,我们不需要重新建立 IFrame 引用)。
<!-- PageA -->
<html>
<head><title>PageA</title></head>
<body>
<IFrame src="PageB" name="frame1" id="frame1"></IFrame>
<button onclick="submitIFrameForm()">Submit</button>
<script>
var frameWindow = frames["frame1"];
function submitIFrameForm(){
frameWindow.SubmitForm(); // move the reference to the click event handler
};
</script>
</body>
</html>
我希望这是有道理的,并且它可以帮助那里的人。我不断地被这种东西所吸引。