私はjQueryと多くのスクリプトを大いに活用する複雑なWebサイトを開発しています。サイトのロード時には、スクリプトは機能していません(ただし、他のスクリプトが正常に機能していることは確認できます)。私は、1つのことを除いて、SEにこのような不自由な質問をここに投稿することはありません。
F12キーを押して開発者ツールを有効にすると、問題をデバッグできるようになり、すべてが即座に完全に機能します!
さらに悪いことに、ブラウザをシャットダウンして起動し、最初にDev Toolsをオンにしてサイトにアクセスすると、すべてが正常に機能します。
だから、開発ツールはそれを修正するので、私はあえてこの問題をデバッグすることさえできません!物事を機能させる開発ツールは何をしているのでしょうか? UAを変更しますか(jQuery.browserの検出を行います)?それはDoctypeに何かをしますか?
編集
すべてのコンソールロギングは、次のラッパーユーティリティ関数でラップされます。
function log(msg){
if (console){
console.log(msg);
}
}
私が試みることができるどんな考えまたは提案も歓迎されるでしょう。解決策が見つかったら、ここに投稿します。
私はここでのパーティーにかなり遅れていることを感謝していますが、IE9のソリューションは少し異なります。
_(function() {
var temp_log = [];
function log() {
if (console && console.log) {
for (var i = 0; i < temp_log.length; i++) {
console.log.call(window, temp_log[i]);
}
console.log.call(window, arguments);
} else {
temp_log.Push(arguments);
}
}
})();
_
基本的に_console.log
_の代わりにlog
を使用します。 _console.log
_が存在する場合、通常どおり動作します。そうでない場合は、ログエントリを配列に格納し、log
が利用可能な次のconsole
に出力します。
console
が利用可能になったらすぐにデータをプッシュすればいいのですが、これはカスタムsetIntervalリスナーを設定するよりも安価です。
私は自分で使用するためにこのスクリプトを更新し、共有したいと考えました。いくつかの価値のある改善点があります。
console.log()
を使用します。つまり、非標準のlog()
を使用する必要がなくなりました。console.log('foo', 'bar')
console.error
_、_console.warn
_、および_console.info
_を使用することもできます(ただし、それらは_console.log
_として出力されます)console
を1000ミリ秒ごとにチェックし、見つかった場合はバッファを出力しますこれらの改善により、これはIE9にとって非常に堅実なシムになったと思います。 GitHubリポジトリを確認してください 。
_if (!window.console) (function() {
var __console, Console;
Console = function() {
var check = setInterval(function() {
var f;
if (window.console && console.log && !console.__buffer) {
clearInterval(check);
f = (Function.prototype.bind) ? Function.prototype.bind.call(console.log, console) : console.log;
for (var i = 0; i < __console.__buffer.length; i++) f.apply(console, __console.__buffer[i]);
}
}, 1000);
function log() {
this.__buffer.Push(arguments);
}
this.log = log;
this.error = log;
this.warn = log;
this.info = log;
this.__buffer = [];
};
__console = window.console = new Console();
})();
_
IEでコンソール呼び出しがあります。開発ツールが開いていない場合、これらは失敗します。簡単な修正は、コンソール呼び出しを次のような関数でラップすることです。
function log(msg) {
if(console)
console.log(msg);
}
他のほとんどのソリューションはうまく機能するはずですが、コンソールが使用できない場合にログメッセージをキャッチする必要がない場合は、ここに短いライナーがあります。
// Stub hack to prevent errors in IE
console = window.console || { log: function() {} };
これにより、毎回何かをラップしたり条件を設定したりする代わりに、ネイティブのconsole.log関数を直接使用できます。
次の方法でハッキングしました
<script type="text/javascript">
(function () {
if (typeof console == "undefined") {
console = {
log : function () {}
}
}
})();
</script>
そして、これはの最初のスクリプト要素です。
IE9でコンソールを検出するには、使用したconsole.logラッパーでは不十分でした。動作するラッパーは次のとおりです SEに関する関連質問から :
_function logError(msg){
try {
console.log(msg);
} catch (error) {
throw new Error(msg);
}
}
function log(msg){
try {
console.log(msg);
} catch (error) { }
}
_
コンソールオブジェクトの可用性の適切なテストは次のようになります。if (typeof console === "undefined" || typeof console.log === "undefined")
ラッパー関数を使用するよりも、単にconsole && console.log('foo', 'bar', 'baz')
を使用する方がはるかに便利だと思います。
あなたが提供したコード:
function logError(msg){
if (console) {
console.log(msg);
} else {
throw new Error(msg);
}
}
console
が定義されていないため、devツールが閉じられたときにIEに対してエラーを生成します。
私はこの問題に何度も遭遇しました。基本的に変数を使用して、これらが有効かどうかを確認します
var somevar;
if (somevar)
//do code
somevarは未定義に解決されるため、これは機能します。しかし、たとえばウィンドウのプロパティをチェックする場合。 window.console。
if (console) <---- this throws an exception
同じチェックを行うことはできません。ブラウザはそれを異なって扱います。基本的にこれを行うだけ
if (window.console) <---- will NOT throw an exception if undefined
//some code
これは最初の例と同じように機能します。したがって、コードを次のように変更する必要があります
function log(msg){
if (window.console){
console.log(msg);
}
}
複数の並列スクリプトファイルがある場合、開発者ツールのオン/オフにより、ファイルが異なる順序でロード/実行されている可能性があります。