为什么我的jquery .on(’change’)不适用于动态添加的选择
我正在动态添加选择元素,如下面的HTML。 我不确定为什么.on(’更改’…)不能用于动态选择。 我错过了什么?
我正在使用Chrome 24.0.1312.57 + jquery 1.8.3。
$(document).ready(function() { $('#x select').on('change', function () { alert('helo'); }) $('#y select').on('change', function () { alert('helo'); }) $('#x').html($('#y').html()); }); O1 O2
你的代码:
$('#x select').on('change', function () { alert('helo'); })
将事件处理程序附加到#x元素内的select。
你想要的东西(从我理解的东西)是这样的:
$("#y").on('change','select',function () { alert('helo'); });
这会将事件处理程序附加到#y元素,该元素将委托给其子元素的“select”元素
来自http://api.jquery.com/on/
.on()方法将事件处理程序附加到jQuery对象中当前选定的元素集。
事件绑定到初始页面加载时不在DOM中的元素将不起作用。 您需要绑定到存在的DOM上的元素,以允许事件向下流动。 这通常是我采取的方法:
$(document).on({ change: function() { alert('helo'); } }, '#x select'); $(document).on({ change: function() { alert('helo'); } }, '#y select');
我更喜欢它,因为您可以轻松添加后续事件。
$(document).on({ change: function() { alert('helo'); }, blur: function() { alert('helo'); } }, '#x select');
您的事件绑定设置在$(document).ready()上。 但是,如果您稍后动态添加它们(例如通过jQuery.appendTo()等),则新添加的组件需要绑定,因为它们不是$(document).ready()中发生的初始组件的一部分。 ,只在加载页面并且最初完成DOM时才运行一次。
正确的语法:
$('#x').on( 'change', 'select', function () { alert('helo'); } );
因此动态元素on()
语法似乎如下:
$(staticParent).on( eventName, target, handler);
.on()的重点是,您可以将事件绑定到文档以外的其他内容。 这就是现在折旧的.live()所做的事情,在大多数情况下都是低效的。 您可以将事件绑定到最不会动态更改的父元素。
据我所知,这是正确的语法:
$('#x').on('change', 'select', function(){ alert('hello'); });
如果要更改#x或#y,请将它们包装在元素上并将事件绑定到该元素。
这很简单。 无论您的目标是什么类别或ID,请尝试更精确但不需要包含超级父母。
错误方式的例子:
$('#tablecontent').on('change', '#tablecontent > table.CampaignGrid > tbody > tr > td', function(e) { console.log('IN TABLE CONTENT CHANGE'); var value = e.target.value; $('button#updateLuck').prop('disabled', false).css({'color': '#000', 'font-weight': 600}); //alert($(ele[0]).html()); });
$('#tablecontent').on('change', '#tablecontent > table.CampaignGrid > tbody > tr > td', function(e) { console.log('IN TABLE CONTENT CHANGE'); var value = e.target.value; $('button#updateLuck').prop('disabled', false).css({'color': '#000', 'font-weight': 600}); //alert($(ele[0]).html()); });
方括号中的单词是alt文本,如果浏览器无法显示图像,则会显示该文本。 请务必为屏幕阅读软件添加有意义的替代文字。
但是,不要使用.live()
/ .bind()
/ .delegate()
。 你应该用。 on()
。
用于静态和动态选择更改
$(document).on('change', 'select', function (e) { // do something });