JavaScript生成的元素不起作用-jQuery
JavaScript generated elements not functioning - jQuery
我有一个如下表;
<table id="mytable">
<tr>
<td>cola1</td>
<td>cola2</td>
<td>cola3</td>
<td class="rem">cola4</td>
</tr>
<tr>
<td>colb1</td>
<td>colb2</td>
<td>colb3</td>
<td class="rem">colb4</td>
</tr>
</table>
<button id="but">Add Row</button>
按钮<button id="but">mybutton</button>
位于表的底部,单击该按钮可向表中添加新行。最后一列行具有类rem
,该类具有在单击时移除父行的功能。
这是javascript
$(document).ready(function() {
$('#but').click(function() {
row = $("<tr></tr>");
col1 = $('<td>colex1</td>');
col2 = $('<td>colex2</td>');
col3 = $('<td>colex3</td>');
col4 = $('<td class="rem">colex4</td>');
row.append(col1,col2,col3,col4).prependTo("#mytable");
});
$('.rem').click(function() {
var $button = $(this);
var $row = $button.closest('tr');
$row.fadeOut('slow');
});
});
函数在上面两行中运行良好。但删除按钮在jQuery添加的行中不起作用。如何使Javascript添加的行像其他行一样工作?
这是小提琴。
如果要将委托的事件处理程序应用于新创建的元素,则需要使用on()来使用它。其工作方式是将处理程序添加到DOM中已经存在(并继续存在)的元素中,然后在处理程序中,当事件冒泡时,它检查事件目标是否与提供给on()
函数的选择器匹配。如果是这样,那么它运行处理程序,否则就不运行。
$('#mytable').on('click','.rem',function() {
var $button = $(this);
var $row = $button.closest('tr');
$row.fadeOut('slow');
});
我认为这在很大程度上取决于您如何处理功能。您可以使用$.on()
或其他侦听器,但如果您知道何时添加元素,并且它完全在您的控制之下,我认为没有必要。
例如:
EDIT-修正了在行上有click
处理程序的问题,将其放在.rem
元素上。
$(document).ready(function() {
var $row = $("<tr>"),
$col1 = $('<td>colex1</td>'),
$col2 = $('<td>colex2</td>'),
$col3 = $('<td>colex3</td>'),
$col4 = $('<td class="rem">colex4</td>');
var addrow = function() {
$row.clone(true).prependTo("#mytable");
};
var removerow = function() {
var $button = $(this),
$row = $button.closest('tr');
$row.fadeOut('slow');
};
$row.append($col1, $col2, $col3, $col4);
// This could be $($col4).click(removerow);, too.
$row.find('.rem').click(removerow);
$('#but').click(addrow);
$('.rem').click(removerow);
});
http://jsfiddle.net/sM2R8/4/
现在,它使用$.clone(true)
缓存新的$row
来复制已添加的单击处理程序。如果你想更改这些值,你需要克隆然后更新这些值,但这只是你想要如何处理的细微差别。您也可以在将removerow
处理程序附加到表之前/之后,将其添加到克隆的元素中。
试试这个:
$('#mytable').on('click', '.rem', function() {
var $button =$(this);
// ...
});
通过这样做,您可以在表本身上建立一个处理程序,用于侦听从包含的元素中冒出的事件。第二个参数是一个选择器,实际目标元素将根据该选择器进行测试。如果它匹配(在本例中,如果它是一个"移除"按钮),则调用处理程序函数。
因此,您可以添加任意多的行,每个新按钮的事件都将被同一个处理程序截获。
您的点击处理程序只能处理现有的行,因为当您调用它时它们确实存在。对于不在DOM中的未来元素,尽管您需要使用一个同时考虑当前和未来元素的委托方法。要做到这一点,请使用委托给表(或永远存在的元素)的on(),并添加按钮类作为选择器
$('#mytable').on('click','.rem',function() {
var $button = $(this);
var $row = $button.closest('tr');
$row.fadeOut('slow');
});
您可以使用
.live(event, handler)
在这种情况下,事件处理程序也将附加到未来的元素。所以使用:
$('.rem').live('click', function() {
var $button = $(this);
var $row = $button.closest('tr');
$row.fadeOut('slow');
});
但是,从jQuery 1.7开始,live()已被弃用,请使用on()
- ng-view 中的脚本在从文件引用时不起作用(JQuery 在角度之前加载)
- 转换效果不起作用jquery
- 淡入淡出和AppendTo不起作用-jQuery
- 变量计算不起作用(jquery/javascript)
- 更改事件不起作用 jQuery 自动完成
- 倒计时不起作用 jquery
- ajax 响应包括 image,onClick 事件对图像不起作用 jQuery
- 从JavaScript添加html,但不起作用jQuery切换功能
- 简单的工具提示插件 - 点击选项不起作用 - jQuery
- 图像滑块不起作用(jquery)- Rails 3项目
- 触发单击事件不起作用 jquery
- 动态创建的 li 点击事件不起作用 jQuery
- Jquery验证不起作用.Jquery-Javascript
- JavaScript生成的元素不起作用-jQuery
- 事件委派不起作用jquery
- 类选择器在追加后不起作用 (JQuery)
- 为什么这个变量不起作用?Jquery
- 首先,渐变有时似乎不起作用(jquery)
- 有什么原因吗('img')加载不起作用(jQuery)
- 更改不起作用jQuery