2011-12-16 154 views
0

函数I首先获得的元素:将参数传递给内部对象

var i=document.getElementsByTagName("fieldset"); 

然后,我创建一个新的对象:

var a=new Fieldset(i[0]); 

函数原型是这样的:

slideDown: function() { 
    alert("here"); 
} 

的构造函数是这样的:

function Fieldset(fieldset){ 
    this.fieldset=fieldset; 
    this.fieldset.addEventListener("click",this.slideDown(this.fieldset),false); 
}; 

问题是slideDown函数在创建新对象并且侦听器未附加到元素时立即调用。

我已经完成了代码,并且在构造函数的fieldset的前面没有this,这对于监听器来说无济于事。我只是不知道我在摸索这个。

+2

看着你的个人资料,看起来你应该知道如何格式化一个比这个更好的问题。 – RightSaidFred 2011-12-16 23:24:21

回答

2

那么,在这个表达

this.fieldset.addEventListener("click",this.slideDown(this.fieldset),false); 

slideDown()被称为以前addEventListener()因为参数赋值在函数被调用之前。

您可能是想传递一个函数对象作为第二个参数,而不是传递由slideDown()返回的值(它不会返回任何东西)。您可以构建这样一个函数对象是这样的:

function Fieldset(fieldset){ 
    this.fieldset=fieldset; 
    var self = this; // stash "this" for use inside listener below. 
    var listener = function() { 
    self.slideDown(fieldset); 
    }; 
    this.fieldset.addEventListener("click", listener, false); 
}; 

我们使用可变self存储的this值。请注意,this不再在listener内部可用。

+0

是的,就是这样。我忘记了这一点。我不是这里的js家伙,但被召唤成行动。 – Rob 2011-12-16 23:35:31

2

你可以换你的事件处理程序的匿名函数:

JS Fiddle

var i=document.getElementsByTagName("fieldset"); 

var a=new Fieldset(i[0]); 

function Fieldset(fieldset){ 
    this.fieldset=fieldset; 
    this.slideDown = function() { 
     alert("here"); 
     } 
     var f = this; 
     this.fieldset.addEventListener("click", function() { 
      f.slideDown(f.fieldset) 
     },false); 
}; 
0
(function (el, h) { 
    el.addEventListener("click", function() {h(el);}, false); 
})(this.fieldset, this.slideDown);