我正在尝试使用jQuery绑定事件处理程序:
$(document).ready(function () {
var newsScrollerForPage = new NewsScroller();
newsScrollerForPage.init();
$('#scroller-left-a').bind('onclick', newsScrollerForPage.decreasePage());
});
<div class="scroller-left">
<a id="scroller-left-a" href="#">
<img src="/Images/Left-Scroller.jpg"/>
</a>
</div>
但我遇到了问题:
处理程序未定义[Break On This 错误] if(!handler.guid){
我试图绑定此事件处理程序的方式有什么问题吗?
答案 0 :(得分:5)
你在这行中做了什么:
$('#scroller-left-a').bind('onclick', newsScrollerForPage.decreasePage());
... 调用您的函数,并将其返回值传递给bind
。 (你也在为事件使用错误的名字。)
相反:
$('#scroller-left-a').bind('click', $.proxy(newsScrollerForPage.decreasePage, newsScrollerForPage));
那里有三处变化:
使用“点击”,而非“onclick”。
不要调用您的功能,参考。
因为我假设你希望this
中的decreasePage
引用newsScrollerForPage
,我正在使用$.proxy
让jQuery去做发生在我们身上$.proxy
接受函数引用(newsScrollerForPage.decreasePage
,注意后面没有()
)和上下文(newsScrollerForPage
)并返回一个新函数当被调用时,将调用该函数并在调用所提供的上下文期间设置上下文(this
值)。
或者,您可以直接使用闭包来代替$.proxy
:
$('#scroller-left-a').bind('click', function() {
newsScrollerForPage.decreasePage();
});
这是有效的,因为匿名函数是对newsScrollerForPage
符号的闭包。但是$.proxy
的优势(除了它的论证是向后的事实,恕我直言)是如果你正在做的范围有很多你不想要关闭的数据,它会创造一个更多的包含关闭你。 (如果这没有意义,我的文章Closures are not complicated可能会有所帮助。)