js 添加 html 元素绑定事件无效,js动态加载HTML元素时出现的无效的点击事件

本文探讨了在页面动态加载元素时如何正确绑定事件处理程序的问题。通过使用jQuery的delegate()方法,确保了即便是在页面加载完成后动态添加的元素也能响应事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中列表数据中隐藏着详情数据,

图一:

79908500_1.png

详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面

图二:

79908500_2.png

js文件中的这些js的点击事件无效:

js代码:

// 推荐商家点击标题展开与收起

$('.toggle-tag').on('click', function(){

var ele = $(this).parents('tr').next().find('.pro-details');

if(ele.is(':hidden')){

$('.pro-details').slideUp();

ele.slideDown();

}else{

ele.slideUp();

}

});

// 推荐商家点击收起

$('.toggle').on('click', function(){

$(this).parents('.pro-details').slideUp();

});

后面找到原因: 是因为这些动态加载的这些HTML页面(图二),是在列表数据页面(图一)的HTML元素,css,js代码加载完后,再添加的HTML元素,

在浏览器解析到图一的页面元素时, 解析到js的这些绑定标签事件的js代码(上面的JS代码)的时候,这些绑定事件的标签元素还没有生成,

(因为js代码加载完后,才会有这些绑定事件的标签),所以这些JS 代码的绑定的事件,根本就没有绑定到这些动态加载的标签上,所以哪些事件不会触发。

解决方案:

-------------------------------------------------------------------------------------

定义和用法

delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。

使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)。

语法

$(selector).delegate(childSelector,event,data,function)

参数描述

childSelector

必需。规定要附加事件处理程序的一个或多个子元素。

event

必需。规定附加到元素的一个或多个事件。

由空格分隔多个事件值。必须是有效的事件。

data

可选。规定传递到函数的额外数据。

function

必需。规定当事件发生时运行的函数。

亲自试一试 - 实例

如何使用 delegate() 方法向尚未创建的元素添加事件处理程序。-----------------------------------------------------------------------------------------------------------我的解决方案 :(红色代码部分, 其余是别的逻辑代码)/**

* 材价详情显示和隐藏

*/

$("body").delegate(".toggle-tag","click", function(){

//点击再加载材价详情数据

var rowData = $(this).parents('tr').find("td").eq(0).find("input").val();

var row = eval("("+rowData+")");

var id = row.id;

var name = row.stdName;

var spec = row.spec;

var unit = row.unit;

var city = row.city;

var province = row.province;

if($('#detailTr_'+id+'_'+city).find("td").length==0){

var html = std_matpriceLib_list.getMatPriceDetailData(id,row);

$('#detailTr_'+id+'_'+city).html(html);

}

// 推荐商家

$('.business-icon li a').hoverIntent({

over:function(){

$(this).find('.name,.opacity').fadeIn('fast');

},

out:function(){

$(this).find('.name,.opacity').fadeOut('fast');

}

});

var ele = $(this).parents('tr').next().find('.pro-details');

if(ele.is(':hidden')){

$('.hideTr').hide();

$('#detailTr_'+id+'_'+city).show();

$('.pro-details').slideUp();

ele.slideDown();

//获取材价点评统计

//          getCommentStatis(id,city);

}else{

$('#detailTr_'+id+'_'+city).hide();

ele.slideUp();

}

loadCharts(id,name,spec,unit,city,province);

});// 推荐商家点击收起

$("body").delegate(".toggle","click", function(){

$(this).parents('.pro-details').slideUp();

$(this).parents('tr').hide();

});

### AJAX加载HTML点击事件未触发的原因 当通过AJAX动态加载HTML内容,新加载元素可能会自动继承原有的事件绑定逻辑。这是因为传统的`click()`方法仅适用于页面初始化已存在的DOM元素[^1]。如果新的HTML片段被注入到文档中,则这些新增加的元素会自动获得之前定义的事件监听器。 具体来说,在jQuery中使用`.click()`这样的直接绑定方式只会针对当前存在于DOM树中的节点生效。对于那些后来才加入到页面上的节点(比如由AJAX请求返回并插入的内容),它们自然也就无法响应此类预先设定好的事件处理器[^2]。 ### 解决方案 #### 方法一:使用事件委派机制 为了使动态添加至网页内的组件能够正常工作,可以采用**事件委派**技术来解决问题。这涉及到把事件监听设置在一个始终存在且改变其状态或者位置的父亲级容器之上,并指定子代匹配的选择器作为参数传递进去。这样即使后代发生变化也能有效捕获目标动作的发生情况。 以下是基于上述原理的一个实现例子: ```javascript $('body').on('click','.dynamic-element-class',function(){ console.log("Dynamic element clicked!"); }); ``` 在这个案例里面,“body”充当了一个稳定的祖先层角色;“.dynamic-element-class”则是我们希望监控的具体类别名称。每当某个属于该类别的项目遭到触动的候,相应的回调就会被执行[^2]。 #### 方法二:重新绑定事件 另一种可行的办法就是在每次完成异步数据获取之后立即再次执行一遍有关联操作的部分代码段落,从而确保最新一批生成出来的对象同样具备应有的行为特性。过这种方法相较于前者效率较低而且容易引起维护困难等问题所以一般推荐优先考虑前面提到过的事件代理模式[^3]。 另外值得注意的是,在某些特殊场景下还可能存在其他干扰因素造成预期之外的结果表现形式,例如CSS样式冲突遮挡实际可交互区域等情况也需要纳入排查范围之内[^4]。 ### 结论 综上所述,解决AJAX加载后的HTML元素点击事件失效的最佳实践通常是运用事件委派策略,即利用像`$(document).on('event','selector',callback)`这样的结构来进行全局性的事件管理而非局限于局部特定刻下的单一赋值过程之中去单独处理每一个可能出现的新实例个体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值