4

私は eval を使用していません。Crockford が次のような問題を抱えている理由がわかりません。次の問題を解決するためのより良いアプローチはありますか、それともこれは無視する必要があるだけですか (改善の余地がある場合は、ソリューションを完成/改善することを好みます)。

私はいくつかのピクセル トラッキングを使用しています。この場合、クライアントは JS 関数をonclick、サイトからリダイレクトする HTML イメージ タグのプロパティにバインドしています。画像上で複数のイベント リスナーと競合状態になることなく、確実にクリックを追跡する必要があります。戦略は、実行時にイベントをオーバーライドし、コピーして独自の関数で実行することです。これは私が管理していないサイトに適用されており、変更できないことに注意してください。したがって、ソリューションは次のようになります。

...
func = Function(img.attr('onclick'));
...
img.attr('onclick', '');
... //some custom tracking code
func.call(this);

JSLint チェッカーがeval is evilエラーをスローします。

hrefアクションに関する複数のイベントの競合状態を回避するより良い方法はありますか?

4

2 に答える 2

7

暗黙的に使用しているのは、HTML の属性として文字列として指定されevalたコールバック関数を要求し、それを使用してa を構築しているためです。Function

img.onclick 代わりにプロパティを使用するだけで、ブラウザーが属性から構築した関数を直接取得できます.call

var func = img.onclick; // access already compiled function
img.onclick = null;     // property change updates the attribute too

... // some custom tracking code

func.call(img, ev);     // call the original function

またはさらに良い:

(function(el) {
    var old = el.onclick;
    el.onclick = function() {
        // do my stuff
        ..
        // invoke the old handler with the same parameters
        old.apply(this, arguments);
    }
})(img);

この後者の方法の利点は 2 つあります。

  1. 新しいグローバル変数は作成されません - すべてが無名クロージャー内に隠されています
  2. 元のハンドラーが、置換関数に提供されたものとまったく同じパラメーターで呼び出されるようにします。
于 2012-04-27T17:16:05.683 に答える
2
var oldClick = myImg.onclick;
myImg.onclick = function(evt){ 
  // Put you own code here
  return oldClick.call( this, evt );
};
于 2012-04-27T17:34:10.013 に答える