以这种方式绑定事件处理程序的问题是错误的吗?

时间:2011-07-07 09:57:03

标签: javascript jquery

我正在尝试使用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){

我试图绑定此事件处理程序的方式有什么问题吗?

1 个答案:

答案 0 :(得分:5)

你在这行中做了什么:

$('#scroller-left-a').bind('onclick', newsScrollerForPage.decreasePage());

... 调用您的函数,并将其返回值传递给bind。 (你也在为事件使用错误的名字。)

相反:

$('#scroller-left-a').bind('click', $.proxy(newsScrollerForPage.decreasePage, newsScrollerForPage));

那里有三处变化:

  1. 使用“点击”,而非“onclick”。

  2. 不要调用您的功能,参考

  3. 因为我假设你希望this中的decreasePage引用newsScrollerForPage,我正在使用$.proxy让jQuery去做发生在我们身上$.proxy接受函数引用(newsScrollerForPage.decreasePage,注意后面没有())和上下文newsScrollerForPage)并返回一个新函数当被调用时,将调用该函数并在调用所提供的上下文期间设置上下文(this值)。

  4. 或者,您可以直接使用闭包来代替$.proxy

    $('#scroller-left-a').bind('click', function() {
        newsScrollerForPage.decreasePage();
    });
    

    这是有效的,因为匿名函数是对newsScrollerForPage符号的闭包。但是$.proxy的优势(除了它的论证是向后的事实,恕我直言)是如果你正在做的范围有很多你不想要关闭的数据,它会创造一个更多的包含关闭你。 (如果这没有意义,我的文章Closures are not complicated可能会有所帮助。)