重新创建按钮组。我以前应该摧毁吗?

时间:2011-08-22 09:02:16

标签: jquery jquery-ui

我在我的应用程序中广泛使用jQuery UI(1.8.16)。

我开发了一个简单的函数,它使用ajax调用获取一些json数据,并使用jQuery UI按钮集在寻呼机中转换DIV:

<div id="answersPager"></div>

这是javascript:

BuildAnswersPager: function(selectedPage, totalPages) {
    $("#answersPager").empty();
    if (totalPages > 1) {
    var ctl = [];
    var isChecked = "";
    for (var i = 1; i <= totalPages; i++) {
        if (i === selectedPage) {
        isChecked = " checked='checked'";
        }
        else {
        isChecked = "";
        }
        ctl[i] = "<input class='answersRadioPager' type='radio' value='" + i + "' id='a_page_" + i + "' name='answer_pager' " + isChecked + "/><label for='a_page_" + i + "'>" + i + "</label>";
    }
    $("#answersPager").append(ctl.join(''));
    $("#answersPager").buttonset();
    }
}

我已将每个按钮绑定到实时点击事件,以便每次用户搜索新术语时,我会重新加载窗口,构建新的寻呼机并允许他/她分页结果。

$(".answersRadioPager").live('click', function() {
   // Fetches json data (new page)
});

一切正常但我想知道在重建它之前是否必须销毁按钮组(此时我只是将其清空)。

我必须注意哪些内存问题?

2 个答案:

答案 0 :(得分:1)

不是真的。 .empty通过jQuery的内部.cleanData方法删除附加到任何已删除标记的所有数据和处理程序,从而防止任何内存泄漏,因此您非常安全。来自docs

  

为了避免内存泄漏,jQuery删除了其他构造,如数据   和删除之前来自子元素的事件处理程序   元素本身。

仅供参考 - .html也会调用.cleanData,因此使用.html('')是等效的。

答案 1 :(得分:0)

一个buttonset(),即使从未连接到父节点,也不会将自己标记为垃圾收集准备就绪。

尝试:

  • 拍摄快照。
  • 实例化n个按钮组,但不要附加到 任何父母,也不添加任何听众。
  • 拍摄快照。
  • 比较两个快照并注意HTMLButtons的增量已增加。

我发现需要调用buttonset('destroy')来解决问题。