2012-04-27 6 views
4

私はevalを使用していないので、Crockfordが次の点でどのような問題があるのか​​分かりません。次の問題を解決するためのより良いアプローチがありますか、これは私が無視する必要があるものです(改善のための領域があれば私のソリューションを完璧に/改善することが望ましい)。関数(..)throws 'eval is evil'メッセージ

私はいくつかのピクセルトラッキングを使用しています。この場合、クライアントはJS関数を、サイトからリダイレクトされるHTMLイメージタグのonclickプロパティにバインドしています。画像のイベントリスナーの倍数で競合状態に陥ることなく、確実にクリックを追跡する必要があります。戦略は、実行時にイベントをオーバーライドし、自分の関数でイベントをコピーして実行することです。これは私が制御しないサイトに適用されており、変更することはできません。だから、解決策のようなものになります。

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

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

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

+0

に供給されているように、元のハンドラがまったく同じパラメータで呼び出されることを保証

  • はあなたのように思える匿名クロージャ内に隠されていますonclickイベントハンドラにjavascriptコードが含まれている場合は、トリガする必要があります。 img.onclick();またはimg.onclick.call(); – GillesC

  • +0

    技術的には、それは_property_で、_attribute_ではありません。 – Alnitak

    +0

    実際にはイベントハンドラですが、属性ではないことを指摘してくれてありがとうので、正しく修正できました。 – GillesC

    答えて

    7

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

    だけではなく、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. は、それが新しいグローバル変数を作成していない - すべてがそれはあなたの置換機能
    +0

    コピーした後に 'onclick'を取り除くので、もはやイメージのプロパティではありません。後で自分のコードの中から関数を呼び出すことに言及しました。私がそこに残しておけば、リダイレクトがそれをカットする前にトラッキングコードが完了することを保証することはできません – patrickgamer

    +1

    @patrickgamerしたがって、元の属性テキストではなく(関数参照)プロパティ値をコピーします。 – Alnitak

    +0

    私はあなたとPhrogzのポストの間を行き来してきました。私は実際には、属性を関数としてコピーし、要素のプロパティをコピーすることの違いを考えたことはありません。どうもありがとう。 – patrickgamer

    2
    var oldClick = myImg.onclick; 
    myImg.onclick = function(evt){ 
        // Put you own code here 
        return oldClick.call(this, evt); 
    }; 
    
    +0

    ああ、あなたは今何を言っているのか分かります。これはもはやJSLintエラーをスローすることはありませんか? – patrickgamer

    +0

    あなた自身のためのTIAS :) – Phrogz

    関連する問題