web-dev-qa-db-ja.com

ページ内のJavaScript構文エラーを無視して、スクリプトの実行を続けます

WordPress用のプラグインを開発しています。ユーザー側(テーマ)のjqueryをjqueryプラグインとして使用します。問題は、他のautorsによって作成された他のプラグインでjavascriptエラーがある場合、プラグインのjavascriptの実行が失敗することです。

そして最悪のことは、エラー処理の条件ステートメントで100%正常に機能するにもかかわらず、私のプラグインに重大な障害があると人々が考えることです。しかし、実際には、他のWP plugin/theme作成者の他のjavascript構文エラーが原因です。

他のJSエラーを無視してプラグインJSを実行し続ける方法はありますか。または、この問題を処理するための提案がありますか?

enter image description here

48

試してください:

window.onerror = function(){
   return true;
}

これは、バグのあるスクリプトが実行される前にこれを含めることができる場合です。

24
Cosmin

古いJavaScriptエラーは多くの問題を引き起こす可能性があるため、今すぐではなく次回のために修正する必要があります。

JavaScriptファイル/コードを最上部(JSにエラーが発生する前)に配置し、他のJavaScriptコードの影響を受けるJavaScriptの前に呼び出します。

実行時にJavaScript例外を処理する必要がある場合、最適なオプションは

try { /* run js code */ } 
    catch (error){ /* resolve the issue or bug */ }
8
Krishna Kumar

errorイベントを使用して、エラーを飲み込むことができるはずです。

$(window).error(function(e){
    e.preventDefault();
});

私はこれを試みたことがありませんが、理論的にはうまくいくはずです。

これはおそらくあなたの問題に対する素晴らしい解決策ではないことに注意してください。プラグインが他のプラグインに干渉している可能性があります。もちろん、エラーはあなた自身の過失ではない可能性がありますが、一般的に言えば(公的にリリースされたプラグインで)そうではありません。

4
Shmiddty

私は同じ問題に遭遇しました:あなたが善良な市民であっても、あまりにも多くの仮定を行い、あなたのページにJavaScriptエラーを引き起こすプラグインがたくさんあります。これらのエラーは、プラグインとは関係ありません。

他のプラグインでエラーを処理しようとする意味はありません。IMOは自己完結型であるがエラーに対する回復力がある方が良いです。

私の場合、エラーによりjquery DOM readyイベントが停止し、JavaScriptの初期化コードが実行されませんでした。ただし、エラーの正確な形式は重要ではありません。解決策は、複数のイベントを発生させることです。

私にとっての解決策は、jQuery DOM readyイベントに依存することに加えて、フォールバックを行うことでした。

  1. DOM readyイベントで起動したいコードを独自の関数にラップしました。 my_hardened_init_action();
  2. 一度だけ実行される関数my_hardened_init()を追加しました。初めて呼び出されたときにmy_hardened_init_action()を呼び出し、後続の呼び出しでは何もしません。
  3. WordPressフッターにmy_hardened_init()を呼び出すためのさまざまなメソッドを追加しました。私の場合、必要なのは2つだけです。最初に、通常のjQuery DOM initを試しましたが、 。したがって、破損したJavaScriptによってjQuery DOM initが起動しない場合、ページの読み込みが完了した直後にタイムアウトが発生します。

他の複数のフォールバックを追加することができます-必要に応じてヘッダーにコードを追加することもできます。 my_hardened_init()は1回しか実行されないため、何度でもトリガーできます。

これは、他の一連の壊れたプラグインを備えた多数のクライアントサイトで機能します。

お役に立てれば。

4
Jhong
2
ScottE

ページが実行されている場合。つかいます:

$(window).error(function(e){
        e.preventDefault();
});  // IGNORE ALL ERROR JQUERY!

または使用:

window.onerror = function(){
   return true;
}  // IGNORE ALL ERROR JAVASCRIPT!
1
<script>
var _z = console;
Object.defineProperty(window, 'console', {
    get: function(){
        if (_z._commandLineAPI) {
         return true;   
        }
        return _z;
    },
    set: function(val) {
        _z = val;
    }
});
</script>
1

プラグインを呼び出す

try{
  ......
}
catch(e){

}
0
Rahul

おそらく、jsをhtmlオブジェクトに配置して、別のページで実行されるようにすることができます。メインページのjsがオブジェクトと対話するために実行しない場合、それはおそらくあまり役​​に立ちません。遊ぶだけの何か。

0
Ian Wizard

これは私のために働いています:

try{
    //your code
}
catch(error)
{
    return true;
}
0
Enginerd Sunio

これらのタイプのエラーでは、通常のtry catchステートメントは機能しません。

考えられる回避策:

JQueryの代わりにinline-cssを使用してバーを左にフロートします(プラグインの完全な機能はわかりませんが、バーを左にフロートするだけの場合は、cssを使用しないのはなぜですか?)

親ページでコードを実行しようとする非表示のiframeがあります。失敗した場合、それはあなたのせいではなかったことをユーザーに警告する(このiframe内から):)

0
codelove