2012-04-20 17 views
0

IE7、IE9、Chrome 18、Firefox 12のイベント(クリックなど)に関数をバインドしようとすると少し混乱します。しかし、私がイベントに関連する機能を削除しようとすると、IE7とFirefoxだけがその機能を切り離すことができます。 これは私が使っているコードです、どうしたのですか?クロスブラウザーイベントハンドラー(追加、削除、トリガー)

bindEvent:function(el,evtType,fn){ 

      if(el.addEventListener){ 
       el.addEventListener(evtType,fn,false); 
      } else { 
       if(el.attachEvent){ 


        var _el=el; 
        var f = function(){fn.call(_el,window.event);} 
        el.attachEvent('on'+evtType, f); 
        el[fn.toString()+evtType]=f; 


        //el.attachEvent('on'+evtType,fn) ; 

       } else { 

        el['on'+evtType]=fn; 
       } 
      } 

    return el; 

    }, 

    removeEvent: function(el,evtType, fn) { 

     if(el.removeEventListener){ 
      el.removeEventListener(evtType, fn, false); 
     }else if(el.detachEvent){ 
      el.detachEvent('on'+evtType,el[fn.toString()+evtType]); 
      el[fn.toString()+evtType]=null; 


     }else{ 

      el['on'+evtType]=function(){}; 

     } 

     return el; 
    } 

これをテストするために私のコードは次のとおりです。

var a = document.getElementById('just_a_div'); 
bindEvent(a,'click',function(){alert('Hi There');}); 

と私は、ほぼ同じを使用削除しようとする:

removeEvent(a,'click',function(){alert('Hi There');}); 

任意のアイデアまたは行うことができますいくつかの既製のスニペットこのタスクはすべてのブラウザで効率的に実行できますか? 解決策が出てくることを願っています。おかげさまでお世話になりました。

+0

残念ながら、OPコードは2005年9月にJohn Resigによって投稿されたものに基づいているようです。コメントにはコードに関するかなりの批判があります。特にメモリーリークに関するものです。 [* Douglas *](http://ejohn.org/projects/flexible-javascript-events/#comment-5882))。彼らはポストで対処されていない。また、[* AJAXイベントハンドラの登録コードはどうなっていますか?*](http://pankaj-k.net/weblog/2007/07/what_is_wrong_with_this_widely.html)の批判も参照してください。 – RobG

答えて

1

あなたのコードはIE8、firefox、およびchromeのmy exampleで動作します(イベントは5秒後に削除されます)。おそらくあなたのテストケースにエラーがありますか?テストケースを見せてもらえますか?彼らは同じパラメータとコンテンツを持っている場合はJavaScript 機能

=== === UPDTAE

も同じになることはありません。試してください:alert(function(){alert('Hi There');} == function(){alert('Hi There');});結果はfalseです。

同じ機能に遭遇すると、機能は同じです。従ってvar fn = function() { alert('clicked'); }; alert(fn == fn);trueです。

my exampleのように、bindEventremoveEventの関数と同じ参照を使用する必要があります。

+0

なぜ5秒? –

+0

オハイオ州、私はあなたのコードを探検しました、それはタイムアウトです!、申し訳ありません、私の間違い。 –

+0

@ codef0rmer私が呼び出す方法は次のとおりです:bindEvent( 'click'、function(){return 'こんにちは;;});しかし、それを削除しようとすると、removeEvent( 'click'、function(){return 'こんにちは;;}); –

0

あまり良い方法ではJavaScriptフレームワークを使用することで、あなたの純粋なJavaScriptコードとすべてのブラウザをサポートするには少し難しいIt`sa、私は最高の一つは、コースのJQuery &である他のフレームワークがたくさんあると思います異なる目的のために設計されています。

+1

jQueryは、イベント処理のためのネイティブなJavaScriptの動作を完全に実装していません。 jQueryを使用すると、同じオブジェクトの同じイベントタイプに対して同じ機能を複数回登録することができます。しかし、 'addEventListener'のネイティブ動作はこれを許可しません。 @AndrewD。 –

+0

しかし、問題は、オブジェクトのイベントに関数を追加するだけでいいということです。 –

0

ブラウザ間のサポートにjQueryを使用します。 .bindを使用してイベントを添付し、unbindを使用してイベントを切り離すことができます。

+0

これは私の目的です.Jqueryを使用しないでください。オブジェクトのイベントに関数を追加するだけです。 –

関連する問題