使用cloneNode(true)后如何保持正确的Javascript事件
我有一个包含多行输入的表单元素。 将每一行视为我想要在 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”对象重新绑定到正确的锚标记?
I have a form element that contains multiple lines of inputs. Think of each line as attributes of a new object that I want to create in my web application. And, I want to be able to create multiple new objects in one HTTP POST. I'm using Javascript's built-in cloneNode(true) method to clone each line. The problem is that each input-line also has a removal link attached to its onclick-event:
// prototype based
<div class="input-line">
<input .../>
<a href="#" onclick="$(this).up().remove();"> Remove </a>
</div>
When the cloned input-line's removal link is clicked, it also removes any input-lines that were cloned from the same dom object. Is it possible to rebind the "this" object to the proper anchor tag after using cloneNode(true) on the above DOM element?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
看起来您正在使用 jQuery? 它有一个用事件克隆元素的方法: http://docs.jquery.com/Manipulation /clone#true
编辑:哎呀我看到你正在使用原型。
Looks like you're using jQuery? It has a method to clone an element with events: http://docs.jquery.com/Manipulation/clone#true
EDIT: Oops I see you're using Prototype.
第一个答案是正确的。
Pornel 含蓄地建议了最跨浏览器和框架无关的解决方案。
尚未对其进行测试,但该概念将在涉及事件的动态情况下发挥作用。
First answer is the correct one.
Pornel is implicitly suggesting the most cross-browser and framework agnostic solution.
Haven't tested it, but the concept will work in these dynamic situations involving events.
为了调试这个问题,我会将您的代码包装
在一个函数中:
这将允许您找出 $(this) 返回的内容。 如果它确实返回多个对象(多行),那么您肯定知道该去哪里查找——在使用cloneNode 创建元素的代码中。 您是否对结果元素进行任何修改(即更改 id 属性)?
如果我遇到您所描述的问题,我会考虑向触发元素和“行”元素添加唯一 ID。
To debug this problem, I would wrap your code
in a function:
This will allow you to find out what $(this) is returning. If it is indeed returning more than one object (multiple rows), then you definitely know where to look -- in the code which creates the element using cloneNode. Do you do any modification of the resulting element (i.e. changing the id attribute)?
If I had the problem you're describing, I would consider adding unique IDs to the triggering element and the "line" element.
我在 IE7 和 FF3 中对此进行了测试,它按预期工作 - 一定还有其他问题发生。
这是我的测试脚本:
I tested this in IE7 and FF3 and it worked as expected - there must be something else going on.
Here's my test script:
您可以尝试使用innerHTML 方法或混合方法进行克隆:
另外:我认为cloneNode 不会克隆使用addEventListener 注册的事件。 但 IE 的 AttachEvent 事件是克隆的。 但我可能错了。
You could try cloning using the innerHTML method, or a mix:
Also: I think cloneNode doesn't clone events, registered with addEventListener. But IE's attachEvent events are cloned. But I might be wrong.
不要在每个链接上放置处理程序(顺便说一句,这实际上应该是一个按钮)。 使用事件冒泡通过一个处理程序处理所有按钮
:
Don't put handler on each link (this really should be a button, BTW). Use event bubbling to handle all buttons with one handler:
+