4

我正在为 Joomla 制作一个模块!使用 Ajax 向数据库呈现不同查询的客户端页面。这些查询的结果是我重新生成了不同 DIV 的整个 HTML 代码。在我的 jQuery 对象中,我有一个名为 as 的函数,cache()它存储我需要将它们附加到不同事件的所有对象。我的问题是,每次我从这些 div 中的任何一个重新生成 HTML 代码时,我都必须重新构建所有对象,因此我创建了一个新函数recache()来使这项工作更容易。

我想这不是最好的程序。有没有办法让这些处理程序保持活动状态而不必cache()每次都调用这个函数,或者有没有办法动态地重新绑定这个对象?

谢谢!

这是我的代码:

    var Object = {
        init: function() {
            this.cache();
            this.bindEvents();
            return this;
        },

        cache: function() {
                   OBJECTS....
                       this.nameObject = $('#anchor');
                       etc..
        },

        recache: function() {
            Objects to be recached as needed.
        },

        bindEvents: function() {
            EVENTS attached to the objects. 
                        this.nameObject.on( 'click', 'context', this.nameFunction );

        },

                    nameFunction: function() {
                        #CODE....
                    }

                }; //END Playlist (Object)

window.Object = Object.init();

我通常使用on()function 而不是delegate(), live()or bind(),但我不确定这正是我的问题。

提前致谢!

4

2 回答 2

11

您暗示了正确的计划:使用.on(). 请记住,当您委托一个侦听器时,您需要委托给一个不会被销毁的侦听器。

或者换句话说:

// will not do anything useful for this scenario:
$('.something').on('click', function() { /* ... */ });

不同于

// use the document as a listener: will work but not efficient
$(document).on('click', '.something', function() { /* ... */ });

这不同于

// use a closer ancestor that is NOT destroyed. Best option if you can
$('#someAncestor').on('click', '.something', function() { /* ... */ });
于 2012-03-30T14:05:25.193 回答
4

在父元素上绑定事件处理程序并使用事件委托来处理事件。通过在父元素上绑定事件处理程序,您不需要将它绑定到所有子元素上。

/ HTML /

<div id="container">
    <button id="button1" class="click">button with click</button>
    <button id="button2" class="click">button with click</button>
</div>

/ Javascript /

// use this
$("#container").on("click", ".click", function(){
    alert(this.id + ": I've been clicked.");
});

// don't use this
$(".click").on("click", function(){
    alert(this.id + ": I've been clicked.");
});
于 2012-03-30T14:11:46.830 回答