可以使用jquery触发器设置event.data吗

可以使用jquery触发器设置event.data吗,jquery,Jquery,使用jQuery.on()可以传递一个可选参数来设置事件数据。你也能用扳机吗 我希望我没有误解您的意思,但您是说用触发器方法传递附加数据吗 $(app.Model).trigger("foo", additionalData); 在别的地方 $(app.Model).on("foo", callback); var callback = function(event, additionalData) { console.log(additionalData); } 请注意,如果使用t

使用jQuery
.on()
可以传递一个可选参数来设置事件数据。你也能用扳机吗

我希望我没有误解您的意思,但您是说用
触发器
方法传递附加数据吗

$(app.Model).trigger("foo", additionalData);
在别的地方

$(app.Model).on("foo", callback);

var callback = function(event, additionalData) {
   console.log(additionalData);
}
请注意,如果使用
trigger
传递附加数据,则回调函数中的第一个参数始终是您正在触发的实际事件

我在括号中使用的
app.Model
是应该触发事件并侦听该事件的对象。将其视为一种名称空间。您可以始终使用
document
、任何DOM选择器甚至您喜欢的对象,只要确保
触发器
上的
都必须使用相同的对象(即,从DOM临时删除的DOM元素容易出错)。

您可以这样做:-

示例

  //Create a new jQuery.Event object without the "new" operator.
  var e = jQuery.Event("click");

  // trigger an artificial click event
  jQuery("body").trigger( e );

您也可以使用相同的方法传递event.data。请参阅此是。文件说:

.trigger(eventType[,extraParameters])

注意我们在这里传递的额外参数与
.bind()
方法的
eventData
参数之间的差异。这两种机制都是将信息传递给事件处理程序的机制,但是
.trigger()
extraParameters
参数允许在触发事件时确定信息,而
eventData
参数传递给
.bind())
要求在绑定处理程序时已计算信息


我知道一个解决办法,我们可以用这个

$("button").on("click", function(event) {
   event.data = $(this).data('events'); // get the data value 
   alert(event.data); //use your data as you want
});


//Now set the data value and trigger
$("button").data('events','youreventsvalue').trigger("click");

这里是jQuery站点中的一个,您可以看到
触发器
函数的声明:
.trigger(eventType[,extraParameters])

extraParameters
必须是一个数组或单个对象,并且允许您使用参数[1+](参数[0]等于事件对象)获取这些对象

下面是一个例子:

$('#foo').bind('custom', function(event) {
  if ( arguments.length > 1 ) {
    $.each(arguments, function(i,arg){
      alert("element " + i + " is " + arg);
    })
  }
});

$('#foo').trigger('custom', ['Custom', 'Event', { 'test' : 'attr from object' }, 123]);

据我所知,与原始版本定义的相同的
dataObject

$('selector').on('eventName', dataObject , functionName)
使用`$('selector').trigger('eventName')时也将发送


您也可以传递参数(与答案中提到的其他参数一样),但这些参数将是附加参数(您仍将拥有在
.on()
函数中设置的
dataObject

这是我采用的方法

$('#foo').on('click', { init: false }, function(e, data) {
        data = data || e.data;
        console.log(data.init); // will be true in the trigger, and false in the click.
    })
    .trigger('click', { init: true });
简短答复: trigger()能否将数据传递给事件处理程序(作为附加参数)

trigger()能否将数据直接传递到event.data对象(只有打开()才能执行此操作)

长话短说 trigger()方法执行5项主要任务

  • 它创建一个JQueryEventObject,其类型和可选名称空间为您提供的名称空间
  • 它发送或发出特定类型的事件,该事件在DOM中向上传播,直到到达顶部或停止传播
  • 它定义了该类型事件的事件处理程序的签名。
    • 函数(事件){…}是默认值
  • 它将事件作为第一个参数传递给这些处理程序
  • 它(可选)将附加参数传递给事件的任何处理程序
    • 函数(事件,附加参数){}
  • 数字3和5对你来说是最重要和最相关的。由于您隐式定义了用于处理此事件的api,因此您希望与触发事件的方式保持一致,以便使用您的代码的人能够与他们使用代码的方式保持一致

    示例1一致性

    function Car(speed, tires, brakes) {
        this.speed = speed;
        this.tires = tires;
        this.brakes = brakes;
    }
    
    Car.prototype.brake = function(amount) {
        // You can do this (Event handler will have access to these parameters)
        car.trigger('brake.car', [this.speed, this.brakes, this.tires, amount])
        // Or this (Event handler will have access to these parameters)
        car.trigger('brake.car', [this, amount])
        // but try not to mix and match with the same event type
    }
    ...
    //This is the first way from above (choose one or the other, but don't mix and match).
    passenger.on('brake.car', {person: passenger}, function(evt, carSpeed, carBrakes, carTires, brakeAmount){
        if(brakeAmount > 50)
            passenger.hangOnTight();
        }
    })
    
    ...
    // This is the second way from above (choose one or the other, but don't mix and match).
    passenger.on('brake.car', function(evt, car, brakeAmount){
        if(brakeAmount > 50)
            passenger.hangOnTight();
        }
    })
    
    示例2下面是一个典型示例,显示了trigger()和on()

    所以记住

    • .trigger():如果需要,发出事件并一致定义参数2、3等
    • .on():事件正在dom中冒泡。做一些事情,添加或使用事件数据,并使用额外的参数触发添加或不添加

    • Tangent:如果您想为可以任意添加或删除的动态元素定义事件处理程序,使用jQuery非常容易。看看这个答案:


      • 我花了一段时间才理解这背后的哲学。事件涉及两个实体:侦听器和调度程序。
        event.data
        字段仅用于侦听器。这有点像给电话号码指定一个名字:

        $("(818)548-2733").on("incomingcall", null, "Mom", pickup);
        
        你可以拿起电话,等对方告诉你她是你妈妈。或者您可以使用
        event.data
        附加与此事件相关的额外信息

        事件的调度程序端调用
        $.trigger
        $.triggerHandler
        方法。这就是为什么他们不允许您指定
        事件.data
        。相反,您可以使用它们的
        外部参数
        参数。

        您可以这样做

        $("pressedButton").on("click", function(event) {
           var buttonID = $(this).data('buttonID');
           alert(buttonID); // alerts 'save' string passed as an argument
        });
        
        $("pressedButton").data('buttonID','save').trigger("click");
        
          <input id="btn" type="button" />
            <input id="btn2" type="button" />​
            $("#btn").bind("click",function(e) {
                var data2 = {type:"click",name:"Raptors",sport:"basketball"};
                $("#btn2").trigger(data2);
            });
            $("#btn2").bind("click",function(e) {
               console.log(e.name + " " + e.sport);
            });
        
        
        ​
        $(“#btn”).bind(“单击”,函数(e){
        var data2={类型:“点击”,名称:“猛禽”,运动:“篮球”};
        $(“#btn2”)。触发器(数据2);
        });
        $(“#btn2”).bind(“单击”,函数(e){
        console.log(e.name+“”+e.sport);
        });
        
        这一点很好。值得一提的是,dataObject可以通过事件的数据属性访问。类似于函数foo(e){console.log(e.data)}+1,文档并没有真正提到如何访问这些额外的数据。您能用代码示例演示如何使用这种方法传递event.data吗?var e=jQuery.event(“click”);e、 data=“一个好数据”;jQuery(“body”)。触发器(e);这是这个问题的正确答案。其他的“答案”是黑客。但这不起作用<代码>e.数据
    在到达
    处理程序上的
    时未定义。这是有效的解决方案。使用它,这是最简单的方法;-)。。。而且是一种非常危险的方式。如果按下的按钮上已经有数据怎么办?这
    
    $("pressedButton").on("click", function(event) {
       var buttonID = $(this).data('buttonID');
       alert(buttonID); // alerts 'save' string passed as an argument
    });
    
    $("pressedButton").data('buttonID','save').trigger("click");
    
      <input id="btn" type="button" />
        <input id="btn2" type="button" />​
        $("#btn").bind("click",function(e) {
            var data2 = {type:"click",name:"Raptors",sport:"basketball"};
            $("#btn2").trigger(data2);
        });
        $("#btn2").bind("click",function(e) {
           console.log(e.name + " " + e.sport);
        });