将参数传递给事件处理程序

问题描述:

在jquery中,如何将附加参数传递给事件处理函数?将参数传递给事件处理程序

因此,例如

mySaveFunction: function(i) { 
var msg = "my message " + i; 
$.ajax({ 
    ... 
    success: this.successFunction, // i want to pass msg to successFunction 
    ... 
}); 

successFunction: function(response) { 
    // do something with msg 

}, 

匿名函数应该在这里做的伎俩。在匿名函数内部,this.successFunction将是未定义的,所以我们需要在匿名函数之外存储对this的引用。

var that = this; 

$.ajax({ 
    ... 
    success: function() { 
     that.successFunction(msg); 
    } 
    ... 
}); 
+0

'this'仍然是'successFunction'以外的东西,可能与上面的代码一样。 (它将成为全局对象)。首先将它放入一个变量中是没有任何目的的,因为这样做并不能保留“this”。 – 2012-07-15 22:05:15

+0

不,但我保留'successFunction',以便在'this'发生变化时可以调用它。对? – 2012-07-15 22:14:29

+0

这项任务确实毫无意义 – Esailija 2012-07-15 22:15:33

你可以使用一个封闭:

mySaveFunction: function(i) { 
var msg = "my message " + i; 
$.ajax({ 
    ... 
    success: function(response) { 
     alert(msg); /* msg is available here */ 
    } 
    ... 
}); 
+0

这不是封闭,这是一个匿名函数。 – 2012-07-15 21:57:26

+3

@ElliotBonneville:这是两个。 – 2012-07-15 21:58:14

+0

是吗?那么,我对闭包的理解必须是关闭的。不过,我会接受你的话。 :) – 2012-07-15 21:59:41

可以使用匿名函数:

success: function() { 
    this.successFunction(parameters); 
    } 
+1

这是行不通的,因为'this'不会是你想要的,所以'this.successFunction'就不对了。 – jfriend00 2012-07-15 22:10:47

+0

这里'this'将是'window'。 – 2012-07-15 22:36:09

+0

我遗漏了我会做的部分var self = this;在定义处理程序之前,然后在匿名函数中使用self。 – Satya 2012-08-05 18:46:33

您可以使用一个封闭:

mySaveFunction: function(i) { 
    var self = this; // <=== Grab what `this` is 
    var msg = "my message " + i; 
    $.ajax({ 
     ... 
     success: function(response) { 
      self.successFunction(response, msg); // <=== Use it and `msg `here 
     ... 
    }); 
// ... 

successFunction: function(response) { 
    // do something with msg 
}, 
+1

'上下文:这可能是更干净的,会upvote,p – Esailija 2012-07-15 22:02:14

+0

@Esailija:公平点,jQuery在这种情况下提供的有用('ajax')。我会离开它,但期望人们会看到评论和理解。 – 2012-07-15 22:04:05

您可以使用$.proxy

mySaveFunction: function(i) { 
    var msg = "my message " + i; 
    $.ajax({ 
      ... 
     success: $.proxy(this.successFunction, this, msg), // i want to pass msg to 
      ... 
    }); 
}, 
successFunction: function(msg, response) { 
    // do something with msg 
}, 

Docs虽然部分应用程序仍然无证,但implemented