4

なんらかの理由で、ブラウザーがそのセッションで初めて起動されたときに、IE9 が JavaScript コードをオンロードで実行していません。ユーザーがページを更新した後にのみオンロードを実行するようです。また、デバッグ コンソールが開いているときにも JavaScript が実行されます。

ブラウザを開いた後に JavaScript がオンロードで実行されるようにするにはどうすればよいですか? これはIE9の単なるバグですか?

理解できるようにもう一度言います:新しいブラウザ セッションを起動した後にサイトにアクセスした場合、コードは実行されません。新しいタブでサイトを開くか、ページをリロードするか、デバッグコンソールを開くと、コードは実行さます

これは、スクリプトのオンロードを実行するために使用する関数です (通常のブラウザーでは正常に動作します)。

(function (i) {
  var u = navigator.userAgent;
  var e = /*@cc_on!@*/
  false;
  var st = setTimeout;
  if (/webkit/i.test(u)) {
    st(function () {
      var dr = document.readyState;
      if (dr == "loaded" || dr == "complete") {
        i()
      } else {
        st(arguments.callee, 10);
      }
    }, 10);
  } else if ((/mozilla/i.test(u) && !/(compati)/.test(u)) || (/opera/i.test(u))) {
    document.addEventListener("DOMContentLoaded", i, false);
  } else if (e) {
    (function () {
      var t = document.createElement('doc:rdy');
      try {
        t.doScroll('left');
        i();
        t = null;
      } catch (e) {
        st(arguments.callee, 0);
      }
    })();
  } else {
    window.onload = i;
  }
})(init); //init is the function to call onload
4

4 に答える 4

14

私はあなたとまったく同じ問題を抱えていました。スライドショーを開始する前に、事前に読み込まれていることを確認したい一連の画像がありました。活用していました

$(window).load(function(){
    //All my code
});

そして、これはまさに私が直面していたものです。

  • IE で URL をコピーして貼り付けたところ、onload イベントが発生していないようでした。
  • F12 を使用してコンソールを開き、ブラウザに URL を貼り付けて Enter キーを押すと、すべてが機能しているように見えました。
  • コンソールを少なくとも 1 回開いたので、
    • コンソールを閉じてからページをリロードすると、onload が起動していました。
    • URL を入力して Enter キーを押すと、onload が起動していました。

何が間違っていたのかを実際に理解するのに数日かかりました。

問題は、console.log ステートメントにありました。コードの多くの場所で、多くのコンソール ロギングを行っていました。私が使用していたプラグインの 1 つでさえ、コードのどこかにコメント解除されたコンソール メッセージがあります。

問題は、IE でコンソールを少なくとも 1 回開かないと、コンソール オブジェクトを使用できないことでした。これは、コードが遭遇した最初の console.log で失敗することを意味します。

さて、IE でテストするためだけに、すべての console.log ステートメントをコメントアウトする気分にはなりませんでした。だから、これは私が代わりにしたことです。document.ready jquery 関数の一番上に、この小さなコード スニペットを書きました。

if(!window.console){
    console={};
    console.log = function(){};
}

基本的に行うことは、ダミーの console.log 関数プレースホルダーを作成して、コードを IE で実行できるようにすることですが、コードまたはプラグインで使用している唯一のコンソール関数が console.log である場合にのみ機能します。 .

ちょうど私の2セント。私が認めようとしているよりも長く、この問題に頭を悩ませてきました。これが少なくとも誰かに役立つことを願っています。

于 2012-10-16T22:29:00.370 に答える
3

コードがまったく実行されないかどうか、つまり、関数に入らないかどうか、または関数内の特定の行で失敗するかどうかを把握する必要があります。IE9 は警告や js エラーを表示しますか?

最も簡単な方法は、コードに一連の alert() ステートメントを貼り付けて、停止する場所を確認し、その行に絞り込むことです。

関数に入らない場合は、呼び出しが行われている場所をより高く見る必要があります。

于 2012-06-09T13:53:42.497 に答える
3

ちょっとしたメモ; デバッグ キーワード (console.log など) または関連するものを使用すると、IE9 は、デバッガーがオンになっていない場合 (F12 を使用) に限り、この JS 関数をエスケープします。

実際、他に何が問題を引き起こしているのかはわかりませんが、私にとっては、デバッガーがIE9でオンになっていないときに「console.log」という単語が発生しました...これはすでに回答済みの質問であることは知っていますが、必要だと感じました知られる。

于 2013-01-22T14:57:23.873 に答える
2

さて、私はそれを理解しました。これは、IE が IF ステートメントを処理する奇妙な方法に関係しています。

私の init 関数には 2 つの IF ステートメントがありました。1 つは変数が存在するかどうかをチェックし、その変数の値をログに記録するものでした。もう 1 つは、同じ変数の値が任意の文字列と等しいかどうかを確認するものです。

最初の IF ステートメントを削除すると、すべてが正常に機能するように見えます。また、以下に示す別の onload 関数を使用することにしました。

if (document.addEventListener) {
    document.addEventListener('DOMContentLoaded', init, true);
} else if (document.all && !window.opera){ //Crude test for IE
//Define a "blank" external JavaScript tag
    document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="javascript:void(0)"><\/script>');
    var contentloadtag=document.getElementById("contentloadtag");
    contentloadtag.onreadystatechange=function(){
        if (this.readyState=="complete") {
            init();
            //ie('open');
        }
    }
}
于 2012-06-09T15:54:48.843 に答える