我有一个包含多行输入的表单元素。将每一行视为我想在Web应用程序中创建的新对象的属性。而且,我希望能够在一个HTTP POST中创建多个新对象。我正在使用Javascript的内置cloneNode(true)方法来克隆每一行。问题是每个输入行还有一个附加到其onclick事件的删除链接:
// prototype based
<div class="input-line">
<input .../>
<a href="#" onclick="$(this).up().remove();"> Remove </a>
</div>
单击克隆的输入行的删除链接时,它还会删除从同一dom对象克隆的所有输入行。在上面的DOM元素上使用cloneNode(true)后,是否可以将“this”对象重新绑定到正确的锚标记?
答案 0 :(得分:7)
不要在每个链接上放置处理程序(这确实应该是一个按钮,BTW)。使用event bubbling使用一个处理程序处理所有按钮:
formObject.onclick = function(e)
{
e=e||event; // IE sucks
var target = e.target||e.srcElement; // and sucks again
// target is the element that has been clicked
if (target && target.className=='remove')
{
target.parentNode.parentNode.removeChild(target.parentNode);
return false; // stop event from bubbling elsewhere
}
}
+
<div>
<input…>
<button type=button class=remove>Remove without JS handler!</button>
</div>
答案 1 :(得分:0)
您可以尝试使用innerHTML方法克隆或混合:
var newItem = $(item).cloneNode(false);
newItem.innerHTML = $(item).innerHTML;
另外:我认为cloneNode不会克隆使用addEventListener注册的事件。但IE的attachEvent事件被克隆。但我可能错了。
答案 2 :(得分:0)
我在IE7和FF3中对此进行了测试,并且按预期工作 - 必须有其他事情发生。
这是我的测试脚本:
<div id="x">
<div class="input-line" id="y">
<input type="text">
<a href="#" onclick="$(this).up().remove();"> Remove </a>
</div>
</div>
<script>
$('x').appendChild($('y').cloneNode(true));
$('x').appendChild($('y').cloneNode(true));
$('x').appendChild($('y').cloneNode(true));
</script>
答案 3 :(得分:0)
要调试此问题,我会将您的代码包装好
$(this).up().remove()
在一个函数中:
function _debugRemoveInputLine(this) {
debugger;
$(this).up().remove();
}
这将允许您找出$(this)返回的内容。如果确实返回了多个对象(多行),那么你肯定知道在哪里看 - 在使用cloneNode创建元素的代码中。您是否对结果元素进行了任何修改(即更改了id属性)?
如果我遇到了您正在描述的问题,我会考虑在触发元素和“line”元素中添加唯一ID。
答案 4 :(得分:0)
第一个答案是正确答案。
Pornel隐含地建议最多的跨浏览器和框架无关的解决方案。
尚未对其进行测试,但该概念适用于涉及事件的动态情况。
答案 5 :(得分:-1)
看起来你正在使用jQuery?它有一种方法来克隆具有事件的元素:http://docs.jquery.com/Manipulation/clone#true
编辑:哎呀我看到你正在使用Prototype。