jQuery append追加元素首项置底、事件绑定失效问题求助
问题根因
两个异常是同一个代码错误导致的:你在cloneTemplate函数里操作DOM时全部用了全局选择器,没有把查找范围限定在当前刚克隆、还没插入页面的内存节点上,导致所有属性修改、事件绑定都命中了页面上已存在的其他元素,根本没作用到你准备插入的新克隆节点上。
具体的逻辑错乱过程:
- 第一次循环处理最高分的第一条数据时,新克隆的节点还存在内存里,全局选择器搜不到它,所有修改都打到了页面上隐藏的模板原始节点上,最后插入输出容器的是没做任何内容修改、没绑事件的空克隆节点
- 第二次循环处理第二条数据时,全局选择器命中了你第一次插入的空节点,把第二条的数据、点击事件全绑到了第一个插入的节点上
- 第三次循环处理第三条数据时,全局选择器命中了你第二次插入的空节点,把第三条的数据、点击事件全绑到了第二个插入的节点上
- 最后一次插入的第三个空节点没有后续迭代给它赋值,而被你错误修改了内容的原始模板节点如果存在样式冲突没被隐藏,就会直接显示在容器最底部,同时第一条数据的事件绑在了错误的节点上,点击自然不会触发弹窗。
修复方案
只需要修改cloneTemplate函数里的DOM查找逻辑,所有对克隆节点内部元素的操作,都从当前克隆的clone对象上发起查找,不要使用无上下文的全局选择器,修复后的代码如下:
function cloneTemplate(index, data){ // 克隆模板 var template = $("#test-template").html().trim(); var clone = $(template); var siteID = data["site_id"]; var totalSiteScore = data["total_site_score"]; // 基于当前克隆节点做所有修改,不需要全局查找 // 0. 给当前克隆的根节点设置对应site id clone.attr("id", `site-${siteID}`); // 1. 更新头部文本 clone.find("div.reddiv > p.header-text").text(`Site ID: ${siteID} - Total Score: ${totalSiteScore}`); // 2. 绑定点击事件 clone.find(".site-navlink").on("click", function () { alert("clicky"); }); // 控制节点显示 clone.removeClass("template-hidden").addClass("template-show"); return clone; }
修复后所有节点的内容、事件都会正确绑定到对应克隆节点上,节点会严格按照你SQL返回的排序顺序依次插入容器,最高分的第一条会正常显示在最顶部,所有条目的点击事件也能正常触发。
补充小提示:如果后续需要动态加载新条目时把更高分的记录放在最顶部,不需要调整SQL排序,直接把循环里的$("#fetch-n-sites-output").append(cloned)改成$("#fetch-n-sites-output").prepend(cloned)即可,新节点会直接插入到容器最顶部。
内容的提问来源于stack exchange,提问作者Ian Murray
相关产品推荐
相关产品推荐

