0

这是出乎意料的。我使用 Chrome 作为我的主要开发浏览器,并大量使用“console.log”(比警报更好!)

无论如何,我在 IFrame 中有一个页面(用于上传图像)。该页面包含经常写入控制台窗口 (console.log) 以进行跟踪的脚本。父页面第一次通过脚本提交嵌入页面,一切顺利。但是,如果我再次尝试提交该页面,则会收到错误消息...

Uncaught TypeError: Cannot call method 'log' of null 

突然之间,控制台似乎不再可用。如果我用警报替换它,警报框会按预期显示,但页面也不再提交。

有没有人经历过这样的事情?

4

1 回答 1

1

我要感谢人们的回应。我没有在 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>

我希望这是有道理的,并且它可以帮助那里的人。我不断地被这种东西所吸引。

于 2013-10-18T19:11:21.960 回答