当使用observe分配该函数时,如何将参数传递给函数?

时间:2010-12-06 04:01:15

标签: javascript prototypejs

我在一个名为“item”的类中有大约12个div元素

我使用for循环将onClick javascript函数附加到每个函数:

for(var i = 0; i < $$(".item").length; i++){
    $$(".item")[i].observe("click", detailPopup);
}

所以,如果我点击任何属于“item”类的元素,它将运行“detailPopup”函数。但我想将参数传递给该函数。更具体地说,我希望传递“this”()。

我该怎么做?

我认为我的问题尽可能具体,但如果我没有,请告诉我,我会澄清我的问题。

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以将this绑定到函数:

for(var i = 0; i < $$(".item").length; i++){
    $$(".item")[i].observe("click", detailPopup.bind(this));
}

JSFiddle Example

答案 1 :(得分:2)

虽然我自己没有明确尝试过,但我相信你应该burn in你的参数。

$$('.item').invoke('observe', 'click', detailPopup.curry(this));

然后将在所有其他参数之前传递对this的引用。您的功能可能类似于以下内容......

function detailPopup(parent, event)
{
    ...

this的原始含义是为处理程序的范围保留的,即触发元素的范围。此外,我使用invoke来避免所有乱用索引值和匿名函数和东西。

答案 2 :(得分:1)

您需要创建一个匿名函数。代替detailPopup,您应该输入类似:function() { detailPopup(that); }

的内容

什么是that?由于this的值未传输到嵌套函数,因此需要先将其分配给变量,然后才能使用它。示例:var that = this;

var that = this;

for(var i = 0; i < $$(".item").length; i++){
   $$(".item")[i].observe("click", function() { detailPopup(that); });
}

答案 3 :(得分:0)

你可以这样做:

for(var i = 0; i < $$(".item").length; i++){
    (function(t){
        $$(".item")[i].observe("click", function { detailPopup(t); });
    })(this);
}

(function(t){ ... })(this);是一个闭包,可确保this是正确的,否则您将获得范围问题。这在一些情况下很重要,因为循环就是其中之一。如果你没有for循环,你可以这样做:

$$(".item")[i].observe("click", function { detailPopup(someParameter); });