0

これは予想外でした。私は Chrome を主要な開発ブラウザとして使用し、「console.log」を多用しています (アラートよりもはるかに優れています!)。

とにかく、IFrame 内にページがあります (画像をアップロードするため)。このページには、追跡目的でコンソール ウィンドウ (console.log) に頻繁に書き出すスクリプトが含まれています。親ページがスクリプトを介して埋め込みページを初めて送信すると、すべてがスムーズに進みます。ただし、ページをもう一度送信しようとすると、エラーが発生します...

Uncaught TypeError: Cannot call method 'log' of null 

突然、コンソールが使用できなくなったようです。アラートに置き換えると、アラート ボックスは期待どおりに表示されますが、ページも送信されなくなります。

誰もこのようなことを以前に経験したことがありますか?

4

1 に答える 1

1

人々の反応に感謝したい。OP にはコードを含めませんでした。これは大規模なスクリプトであり、実行しようとしていたことの「例」を解析することで、関連性が取り除かれる可能性が高いためです。

私は投稿していますが、問題を発見したと言っています。

PageA には、PageB が読み込まれる IFrame が含まれています。

<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 に答える