JavaScriptがIEで一度開発者ツールを開いた後にのみ機能するのはなぜですか?


638

IE9のバグ-JavaScriptは、開発者ツールを1度開いた後でのみ機能します。

私たちのサイトはユーザーに無料のPDFダウンロードを提供し、シンプルな「ダウンロードするパスワードを入力する」機能を備えています。ただし、Internet Explorerではまったく機能しません。

このでは、自分で確認できます。

ダウンロードパスは「makeuseof」です。他のブラウザでは、正常に動作します。IEでは、どちらのボタンも何もしません。

私が見つけた最も奇妙なことは、F12で開発者ツールバーを開いたり閉じたりすると、突然すべてが機能し始めるということです。

互換モードなどを試しましたが、違いはありません。

Internet Explorerでこれを機能させるにはどうすればよいですか?


3
クロスブラウザーラッパーを使用:github.com/MichaelZelensky/log.js
Michael Zelensky

1
ビルドステップがある場合は、のようなものを使用することをお勧めしますgulp-strip-debug。すべてのconsole.*メソッドが削除され、本番ビルドやIEでのテストに最適です。
Knowasilya 2014

15
将来のGoogle社員向け:同じ症状がありましたが、IE11で発生しました。ええと、答えはに関連しているのconsoleではなく、角度とgetリクエストのキャッシュの使用に関連していることがわかりました。詳細については、ここここで回答を参照してください。
Christoffer Lette 2014

@ChristofferLetteはい、私は同じ問題が確認してください持っているstackoverflow.com/questions/31428126/...の開発者ツールを開いたときに、コードが正常に動作...
Pranav Bilurkar

5
このような問題について最も煩わしいことは?開発者コンソールを開くとすぐに機能し始めるため、デバッグはほとんど不可能です。
jlewkovich 2016年

回答:


815

JavaScriptにデバッグコードが含まれている可能性があります。

説明しているエクスペリエンスconsole.log()は、その他のconsole機能を含むコードの典型的なものです。

consoleDevのツールバーが開かれたときにオブジェクトにのみ有効になります。その前に、コンソールオブジェクトを呼び出すと、として報告されundefinedます。ツールバーが開かれた後、コンソールは存在します(ツールバーがその後閉じられた場合でも)ので、コンソール呼び出しは機能します。

これにはいくつかの解決策があります:

最も明白なのは、コードへの参照を削除することconsoleです。とにかく、そのようなものを製品コードに残すべきではありません。

コンソールの参照を保持したい場合は、if()ステートメント、またはコンソールオブジェクトを呼び出す前にコンソールオブジェクトが存在するかどうかを確認するその他の条件でラップできます。


8
デバッグコードを残すための回避策はありますか?IEは、このような
異常

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

79
@Meekohi if(!console)でも同じエラーが発生します-読む必要がありますif(!window.console)
mindplay.dk 2012

9
そう... IEは、スクリプトを使用して最初から機能するはずだったものを修正する少数の開発者に迷惑をかけないように、すべての新しいjs開発者が常に使用する機能を実装するべきではありませんでした...しかし、それは不公平ですそのためにIEをノックするには?あなたはとても寛大な人です。:)
ジョーダン・デイビス

7
それでもIE11で発生する
Michael

162

HTML5のボイラープレートには、コンソールの問題を修正するための優れた既成のコードがあります。

// Avoid `console` errors in browsers that lack a console.
(function() {
    var method;
    var noop = function () {};
    var methods = [
        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
        'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || {});

    while (length--) {
        method = methods[length];

        // Only stub undefined methods.
        if (!console[method]) {
            console[method] = noop;
        }
    }
}());

コメントで@plusが指摘したように、最新バージョンはGitHubページで入手できます


8
@plus 'コメント内のリンクは無効になりました。コードはsrcサブディレクトリにプッシュダウンされました:github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js
Christoffer

153

console.log問題以外に考えられる別の理由は次のとおりです(少なくともIE11では):

コンソールが開いていない場合、IEはかなり積極的なキャッシュを行うので、すべての$.ajax呼び出しまたはXMLHttpRequest呼び出しでキャッシュがfalseに設定されていることを確認してください。

例えば:

$.ajax({cache: false, ...})

開発者コンソールが開いている場合、キャッシングはそれほど積極的ではありません。バグのようです(または機能ですか?)


9
これは私を救っただけです;)ありがとう!コンソールを開いて閉じた状態でWebサイトをテストおよびデバッグするのと同じ条件が必要であるため、これはバグだと思います。
Chnoch 2015年

私のために働いた。具体的には、stackoverflow.com
questions / 13391563 /…

2
実際の答えだと思うので、これはもっと高くなるはずです... IEのバージョンによっては、console.logに関して受け入れられた答えはエラーをスローし、ここで説明されている動作を引き起こしません。
ミグは

63

これにより、マイナーな変更を加えた後の問題が解決しました。IE9の問題を修正するために、htmlページに次のコードを追加しました。

<script type="text/javascript">
    // IE9 fix
    if(!window.console) {
        var console = {
            log : function(){},
            warn : function(){},
            error : function(){},
            time : function(){},
            timeEnd : function(){}
        }
    }
</script>

1
このソリューションは、Windows 7 64ビット上のIE 11では機能しません。
Vikram 2017

1
これにより、Windows 7 64ビット上のIE 11での問題が解決しました。
ゾーンヤン

29

console承認された回答などで言及されている「」の使用に関する問題の他に、Internet Explorerのページが開発者ツールがアクティブになっている場合にのみ機能する場合がある、少なくとももう1つの理由があります。

開発者ツールが有効になっている場合、IEは通常モードのように実際にはHTTPキャッシュを使用しません(少なくともIE 11のデフォルトでは)。

これは、サイトまたはページにキャッシュの問題がある場合(たとえば、キャッシュが必要以上にキャッシュされている場合-これは私の場合)、F12モードではその問題が発生しないことを意味します。そのため、JavaScriptがキャッシュされたAJAXリクエストを実行する場合、通常モードでは期待どおりに機能せず、F12モードでは正常に機能する可能性があります。


1
xmlHttpReqリクエストのキャッシュを無効にする方法については、stackoverflow.com / questions / 3984961 /…を参照してください。
マイケル・ロス

1
甘い。これは驚くほどうまくいきました。Angularの$ httpサービスはバストをキャッシュしないと思いました。

17

私はこれが役立つと思います、これをjavascriptのタグの前に追加します:

try{
  console
}catch(e){
   console={}; console.log = function(){};
}

11
try catch変数が存在することを検出するのは悪い考えです。遅いだけでなく、tryブロックに複数のステートメントがある場合、別の理由で例外が発生する可能性があります。これを使用しないでください。少なくとも使用してくださいif (typeof console == 'undefined')
フアンメンデス

8

AngularJSバージョン1.Xを使用している場合は、console.logを直接使用する代わりに$ logサービスを使用できます。

ロギングのためのシンプルなサービス。デフォルトの実装では、メッセージがブラウザのコンソール(存在する場合)に安全に書き込まれます。

https://docs.angularjs.org/api/ng/service/$log

したがって、次のようなものがある場合

angular.module('logExample', [])
  .controller('LogController', ['$scope', function($scope) {
    console.log('Hello World!');
 }]);

あなたはそれを置き換えることができます

angular.module('logExample', [])
  .controller('LogController', ['$scope', '$log', function($scope, $log) {
    $log.log('Hello World!');
 }]);

Angular 2+には、組み込みのログサービスはありません


これは私を助けてくれました。typescriptを使用している他の人に感謝します。これは角度定義の「ILogService」です
DannykPowell

IIRCで$ logを使用すると、console.logを使用する場合とは異なり、ログステートメントの場所が不明瞭になります。開発中の私の経験からあまりよくありません。
JesseDahl

5

あなたが使用angularしている場合、すなわち、9, 10またはedge使用する場合:

myModule.config(['$httpProvider', function($httpProvider) {
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};    
    }    

    // Answer edited to include suggestions from comments
    // because previous version of code introduced browser-related errors

    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
    // extra
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);

完全に無効にするcache


4

IE 11で発生しました。そして、私はjquery .load関数を呼び出していました。だから私はそれを昔ながらの方法で行い、URLに何かを入れてキャッシュを無効にしました。

$("#divToReplaceHtml").load('@Url.Action("Action", "Controller")/' + @Model.ID + "?nocache=" + new Date().getTime());

2

runudstodotresdeが提供するソリューションの別の代替案も入手しました。これは、Spudleyの回答へのコメントで説明されている落とし穴も回避します。

        try {
            console.log(message);
        } catch (e) {
        }

それは少しだらしないですが、一方では簡潔で、runeksの回答でカバーされているすべてのロギングメソッドをカバーしており、いつでもIEのコンソールウィンドウを開くことができ、ログが流入するという大きな利点があります。


0

Windows 7とWindows 10のIE 11でこの問題に遭遇しました。IEのデバッグ機能をオンにすることで問題が正確に何であるかを発見しました(IE> Internet Options> Advancedタブ> Browsing> Uncheck Disable Disable script debug(Internet Explorer))。この機能は通常、ドメイン管理者によって環境内でチェックされます。

問題はconsole.debug(...)、JavaScriptコード内でメソッドを使用していたためです。開発者(私)が行った仮定は、クライアントの開発者ツールコンソールが明示的に開かれていない場合は何も書かないことでした。ChromeとFirefoxはこの戦略に同意しているように見えましたが、IE 11はそれを少し嫌いでした。すべてのconsole.debug(...)ステートメントをconsole.log(...)ステートメントに変更することで、クライアントコンソールに追加情報を記録し、開いているときにそれを表示することができましたが、それ以外の場合は一般的なユーザーからは非表示にしておくことができました。


0

私は問題を解決して修正しました。ページにキャッシュの問題があったため、JavaScript内に配置したAJAXリクエストが処理されなかったようです。サイトまたはページにキャッシュの問題がある場合、開発者/ F12モードではその問題は発生しません。キャッシュされたJavaScript AJAXリクエストは、期待どおりに動作せず、実行が中断する可能性があるため、F12ではまったく問題ありません。そのため、キャッシュをfalseにする新しいパラメーターを追加しました。

$.ajax({
  cache: false,
});

IEは、AJAXおよびJavaScriptアクティビティが適切に実行されるように、これをfalseにする必要があるようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.