1

onclickイベントからイベントオブジェクトを渡そうとしているときに、クロスブラウザの問題に直面しています。

現在、私は次のことをしています

for (var i = 0; i < list.length; i++)
{
  var link= list[i];     
  link.onclick = function(el) {  return function () {LinkManager.HandleOnClick(window.event, el); }}(link);
 }

Firefoxはwindow.eventを尊重しません。しかし、他にどのようにそれを渡すことができますか?

私は「きれいではない」解決策に頼りました:

for (var i = 0; i < list.length; i++)
{
  var link= list[i];     
  link.onclick =  SomeClickHandler;
 }

function SomeClickHandler(e)
{
  e = e || window.event;
  if (typeof (e) !== 'undefined')
  {
    var element = e.target || e.srcElement;
    LinkManager.HandleOnClick(e, element);
  }
}

誰かがそれを解決するためのより良い方法をお勧めできますか?私が行った回避策は本当に気に入らなかった。

ありがとう、

4

2 に答える 2

0
var handler = function (evt) {
    // do something here
}

if(window.addEventListener) {
    link.addEventListener("click", handler);
} else if(document.attachEvent) {
    link.attachEvent("onclick", handler)
}
于 2012-07-30T13:43:28.563 に答える
0

私の理解が正しければ、ハンドラーがel呼び出されたときに、変数とイベント オブジェクトにアクセスできるようにする必要があります。それは可能であり、それほど難しいことではありませんが、クロージャーについて読みたいと思うかもしれません:

link.onclick = (function(el)
{
    return function (e)//this function will receive the event object
    {
        e = e || window.event;//for ie
        LinkManager.HandleOnClick(e, el);
    }
})(link);

しかし、正直なところ、これはやり過ぎです。これを試してください(しゃれが意図されています):

link.onclick = function(e)
{//this refers to `link`, the clicked element
    e = e || window.event;//for ie
    LinkManager.HandleOnClick(e, this);
};

またはさらに少ないコード:

link.onclick = function(e)
{//this refers to `link`, the clicked element
    e = e || window.event;//for ie
    LinkManager.HandleOnClick.apply(this,[e]);
    //LinkManager.HandleOnClick will receive 1 argument, the event object, and 'this' will point to 'link'
};

さらに少ない:

link.onclick = LinkManager.HandleOnClick;//this === link, 1 argument: the event object

とはいえ、リストを反復し、個々の子要素にイベント リスナーをアタッチしています。委任を使用することを強くお勧めします。

if (list.addEventListener)
{
    list.addEventListener('click',LinkManager.HandleOnClick,false);
}
else if (list.attachEvent)
{
    list.attachEvent('onclick',LinkManager.HandleOnClick);
}
else
{
    //use the loop you have now as a last resort
}

//LinkManager.HandleOnClick should start like so:
LinkManager.HandleOnClick = function(e)
{
    e = e || window.event;//<- you have the event object here
    var target = e.target || e.srcElement;//=== list item: your link variables, your element
    console.log(this);//<-should reference the list element (<ul> || <ol>)
};

とにかく、それが私がこれに取り組む方法です

于 2012-07-30T14:27:38.590 に答える