2013-02-09 117 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()旨在一个新的函数引用,要求将始终具有给定的上下文时。它对当前的函数的上下文没有任何作用。