2011-12-16 152 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);