是否可以为jquery事件对象添加自定义属性?

时间:2011-10-27 21:21:58

标签: javascript jquery javascript-events

示例代码如下:

$('a').mousedown(function(event)
   {
            event.ABC = true;

   });

$(window).mousedown(function(event)
    {
        console.log("event.ABC:",event.ABC);
         //outputs "undefined "

        if( event.ABC)
        {
          // do sth
        } 
        else
        {
            //let it go  
        }


    });

6 个答案:

答案 0 :(得分:5)

其他人已经提到为每个回调重新创建jQuery事件,这就是为什么你添加到jQuery事件的任何属性都会丢失。

但是,jQuery事件具有originalEvent属性,确实在整个事件传播阶段持续存在。

而不是event.ABC,您可以event.originalEvent.ABC

注意:如果您打算广泛使用它,您可能需要添加myAppData属性来存储您的所有数据,即event.originalEvent.myAppData.ABC。这样可以轻松识别哪些事件属性是您的自定义属性,还可以减少名称冲突的可能性。

答案 1 :(得分:4)

虽然我不确定你想要做什么,但我猜想如果你不必弄乱事件对象会更容易。只需在点击<a>时设置标记变量:

var eventABC = false;

$('a').mousedown(function() {
        eventABC = true;
});

$(window).mousedown(function() {
    console.log("eventABC:", eventABC);
    //outputs true if <a> clicked, false otherwise

    if(eventABC) {
      // do sth
    } else {
        //let it go  
    }

    eventABC = false;
});

但是你可以在jQuery中触发事件。像这样:

$('a').click(function() {
    $(window).trigger("eventABC", ['CustomProperty1', 'CustomProperty2']);
    return false;
});

$(window).bind('eventABC', function(event, param1, param2) {
    alert("eventABC triggered: " + param1);
});

答案 2 :(得分:1)

您的示例遇到的问题是为每个回调创建了新的事件对象,它不是传递给每个事件回调函数的全局对象。

您最好的选择可能是在适当的范围级别创建自己的EventArgs对象,并将所有属性添加到您需要的位置。

答案 3 :(得分:0)

输出未定义,因为无论何时触发事件,都会创建新的事件对象。你刚刚修改了一些不同的事件对象。不幸的是,除了重写jQuery之外没有办法做到这一点。 ;)尝试使用其他一些(全局)变量/对象。

答案 4 :(得分:0)

您可以向事件对象添加其他数据。

$('a').bind('mousedown',{ABC:true},function(event)
  alert(event.data.ABC);
});

但是,该数据仅在该事件处理程序中可用,而不是绑定到窗口的数据。

答案 5 :(得分:0)

试试这个

 $("*").mousedown(function(e){
e.ABC = "abcdef";
}); //place this code first

然后你可以像那样使用它

$("yourSelector").mousedown(function(e){ alert(e.ABC); // >> abcdef });

exemple