3

他の人の JavaScript ファイルの問題をトラブルシューティングしようとしていますが、彼らは次のような関数を宣言しました。

function window.confirm(str) {
..... code here .....
}

これは IE では正常に動作しますが、Google Chrome では、ピリオドでキャッチされない構文エラーがスローされwindow.confirmます。以下のように try catch を配置しようとしましたが、同じ構文エラーでうまくいきませんでした。そうすると、その JavaScript ファイルで定義されている関数を使用できなくなります。

try {
    var window.confirm = function(str) {
        ..... code here .....
    };
}
catch(e) {}

また、以下のように宣言を変数に変更しようとしましたが、それもうまくいきませんでした。同じエラー。

var window.confirm = function(str) {
    ..... code here .....
};

Chromeでこれをキャッチする方法はありますか?

4

4 に答える 4

3

2つのポイント:

  • try/catchコンパイルエラーではなく、実行エラーを検出するために使用されます。構文エラーのあるコードをデプロイしないでください。

  • function window.confirm(){避ける必要のあるMSイディオムです。window.confirm = function() {または、グローバルスコープにいる場合は、単に。を使用できますvar confirm = function() {

于 2012-11-07T16:08:08.163 に答える
3

function window.confirm(str)およびvar window.confirm ...は無効です。代わりに、次を試してください。

window.confirm = function(str){
..... code here .....
}
于 2012-11-07T16:08:45.073 に答える
2

「Uncaught SyntaxError」エラーをどうしてもキャッチする必要がある場合は、JavaScript の床下に隠れている、誤解されている stepchildeval()関数に頼る必要があります。

以下のサンプル コードでobjは、受信文字列が有効なオブジェクトに評価される場合にのみ更新されます。それ以外の場合objは、デフォルトで になります{}。CMS$someTextFieldテキストエリア フィールドに入力された設定を取得し、コンテンツ エディターがこの不正な形式の文字列をフィールドに入力したとします。

{
  "foo": "bar
}

サンプルコード:

var oSettings = {};

// Returns "Uncaught SyntaxError: Unexpected token ILLEGAL(…)"
try {
  oSettings = <?php echo $someTextField ?>;
} catch(e) {}

// This works
try {
  eval('oSettings = <?php echo $someTextField ?>');
} catch(e) {}

評価される文字列が何らかの外部ソース (CMS など) からのものであり、この例のようにそれを制御できない場合は、次の 3 つのことを行う必要があることに注意してください。

  1. アプリを破壊する可能性のある JavaScript コードの実行を検出して防止します。

  2. JavaScript の引用符との競合を避けるために、受信文字列の引用符をエスケープします。この例では PHP を使用しているため、次のようにすることをお勧めします。

    eval('oSettings = <?php echo addslashes($someTextField) ?>');

  3. 評価される文字列は 1 行に収まる必要があるため、改行を削除します。次のようにするとさらによいでしょう。

    eval('oSettings = <?php echo addslashes(str_replace(array("\r\n", "\n", "\r"), "", $someTextField)) ?>');

于 2016-04-08T09:41:30.747 に答える
1

構文エラーを修正する必要があります。構文エラーはコンパイル時エラーであり、try / catchは実行時エラーのみをキャッチできるため、try/catchは構文エラーをキャッチしません。

于 2012-11-07T16:07:52.080 に答える