2013-02-09 240 views
0

您好我正在嘗試學習使用jQuery Librari 1.9以更加面向對象的方式在JavaScript中工作。我在一個小型項目中的某個位置必須更改此對象的範圍。這裏是我的html:設置此範圍

<div id="contact"> 
<h2>Contact Me</h2> 
<form action="#"> 
    <ul> 
     <li> 
      <label for="name">Name: </label> 
      <input name="name" id="name"> 
     </li> 

     <li> 
      <label for="email">Email Address: </label> 
      <input name="email" id="email"> 
     </li> 

     <li> 
      <label for="comments">What's Up?</label> 
      <textarea name="comments" id="comments" cols="30" rows="10"></textarea> 
     </li> 
     <li> 
      <input type="submit" value="Submit"> 
     </li> 
    </ul> 
</form> 

這裏是我的javascript

var contactForm = { 
    contact : $('div#contact'), 

    init : function(){ 
     this.contact.hide(); 
     $('<button></button>' , { 
      text : "Display Contact" 
     }).insertAfter('article') 
      .on('click' , this.show); 
    }, 

    show : function(){ 
     $.proxy(contactForm , this) 
     this.contact.slideDown(); 

    } 
}; 

contactForm.init(); 

的問題是在我的節目method.I知道我可以設置的 「本」 使用SCOP $ .proxy()。但我必須做錯了,因爲即使在settign $ .proxy之後,「this」關鍵字仍然指向該按鈕。

我怎樣才能讓這個「本」關鍵字請參閱「聯繫形式」對象

+0

嗨,我用代理的代碼的工作副本添加更多的解釋。請再次查看。 http://jsfiddle.net/Brnv2/4/ – 2013-02-09 21:12:47

回答

0

這應該工作:

.on('click', $.proxy(this.show, this)); 

,並顯示:

show: function() { 
    this.contact.slideDown(); 
} 
0

閱讀有關代理的文檔,也不會改變目前的方法「這個」背景。代理簽名是$.proxy(myFunction, thisVar),這意味着代理將返回函數myFunction,並且當它執行myFunction時,此值將引用thisVar

這是否解決了您的問題?

這意味着你要改變你的放映功能是這樣的:

show : function(){ 
    $.proxy(function(){ this.slideDown() }, contactForm)(); 

} 

這裏是它如何工作的

f = $.proxy(function(){ console.log(this.msg); } , { msg: "hello world" }); 
f(); // ==> should log to console "hello world" 

這裏一個簡單的例子是fiddle to see it in action

你也可以將參數傳遞給函數。例如:

f = $.proxy(function(msg){ console.log([this,msg]); }, { topic:"my topic" }) 
f("hello world"); 

看到一個fiddle也看到這個在行動。

最後但並非最不重要的,這是一個fiddle with your code working like I suggested.

+0

我已經嘗試過,但它仍然無法正常工作 – aleczandru 2013-02-09 20:43:12

0

你的錯誤是在這裏:

.on('click' , this.show) 

本書雖然是呃這是指this.show,當show隨後被調用爲事件處理程序時,它不會將上下文設置爲this。你有一個函數引用,但它最終會從最初包含它的對象中分離出來。

你應該使用:

.on('click', $.proxy(this.show, this)) 

,並從內部.show

注意去除$.proxy呼叫$.proxy()旨在一個新的函數引用,要求將始終具有給定的上下文時。它對當前的函數的上下文沒有任何作用。