当前位置: 首页 > 知识库问答 >
问题:

jquery - jQuery动态更新SVG后,点击事件为何失效?

小牛22984
2024-07-22
<svg id="svg-1" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; display: inline; width: inherit; min-width: inherit; max-width: inherit; height: inherit; min-height: inherit; max-height: inherit;" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events">
<g class="class1"><g role="group" class="class2"><g><g fill="#93c317" class="path1" stroke="#ffffff" stroke-width="1" opacity="1" id="id1"><g><g shape-rendering="auto"><path d="......"></path></g></g></g></g></g></g>
</svg>
$('.class1 .class2 .path1').on("click", function() {  alert('12345'); });

此时点击svg区域会有弹窗显示12345,然后我使用jquery动态更新svg内容:

$('#svg-1').html('<g class="class1"><g role="group" class="class2"><g><g fill="#93c317" class="path1" stroke="#ffffff" stroke-width="1" opacity="1" id="id2"><g><g shape-rendering="auto"><path d="........."></path></g></g></g></g></g></g>');

然后我再点击svg区域却显示没有任何弹窗。

请教为何动态生成的svg内容无法响应点击事件呢?感谢。

我通过console控制台执行如下代码后,再点击svg区域却可以显示12345弹窗:

$('.class1 .class2 .path1').on("click", function() {  alert('12345'); });

使用

$('#svg-1').on("click", '.class1 .class2 .path1', function() {
    alert('12345');
});

仍然没有弹窗显示!

共有3个答案

曾承弼
2024-07-22

动态更新html后,原先元素上绑定的事件随着原先元素的更新失效了,对新更新的元素重新绑定一次即可:

$('#svg-1').html('<g class="class1"><g role="group" class="class2"><g><g fill="#93c317" class="path1" stroke="#ffffff" stroke-width="1" opacity="1" id="id2"><g><g shape-rendering="auto"><path d="........."></path></g></g></g></g></g></g>');
$('.class1 .class2 .path1').on("click", function() {  alert('12345'); });
漆雕育
2024-07-22

因为你之前的事件是绑定在path1上的,新增的元素虽然class也是path1,但已经不是同一个元素了。

对于这种情况,通常使用冒泡的原理,把事件绑定在上级不被移除的元素上,比如$('#svg-1').on('click', '.class1 .class2 .path1', function(){...})

樊烨烨
2024-07-22

在 jQuery 中,如果你使用 .on() 方法来绑定事件到一组元素上,而这些元素是后来动态添加到 DOM 中的,你需要使用事件委托(Event Delegation)的方式。

当你使用 $('#someElement').on('click', 'someSelector', function() {...}) 的形式时,如果 'someSelector' 指向的元素在绑定事件时还不存在于 DOM 中,那么这些元素将不会响应点击事件,除非你将事件绑定到一个在元素添加之前已经存在于 DOM 中的父元素上,并使用 'someSelector' 作为第二个参数。

在你的情况下,你可以将事件委托到 #svg-1 上,因为 #svg-1 是在你动态添加元素之前就已经存在于 DOM 中的。以下是使用事件委托的示例代码:

$('#svg-1').on("click", '.class1 .class2 .path1', function() {
    alert('12345');
});

这段代码的意思是,当 #svg-1 内部的任何元素(或其后代元素)被点击时,jQuery 会检查被点击的元素是否匹配选择器 '.class1 .class2 .path1'。如果匹配,则执行指定的函数(显示一个弹窗)。

使用这种方式,即使你后来动态地向 #svg-1 中添加了新的 .path1 元素,它们也会响应点击事件,因为事件监听器是绑定到不会改变的父元素 #svg-1 上的。

请注意,在动态更新 SVG 内容后,你不需要再次绑定点击事件监听器,因为使用事件委托的方式已经实现了这一点。只需确保你的事件委托代码在 SVG 内容更新之前已经执行过即可。

 类似资料:
  • 本文向大家介绍jQuery中slideUp 和 slideDown 的点击事件,包括了jQuery中slideUp 和 slideDown 的点击事件的使用技巧和注意事项,需要的朋友参考一下 先贴代码,再讲详细事件 重点(Tips): 1、click 事件 按钮的选择    在这个断码中是  “.flip” 2、节点的选择   在这段代码中是 “.panel” 再贴一段代码 .slideToggl

  • 本文向大家介绍jQuery实现移动 和 渐变特效的点击事件,包括了jQuery实现移动 和 渐变特效的点击事件的使用技巧和注意事项,需要的朋友参考一下 先看代码: .animate  事件,是这个 里面的新的东西。解释起来就是  使div 块儿  变得有灵魂 可以移动。  Tips: 1、click 事件的  点击节点的选择 2、通过 var div=$(".box")  来选择需要控制的 css

  • 问题内容: 我在页面上有可以用jQuery拖动的元素。这些元素是否具有单击事件,可以导航到另一个页面(例如,普通链接)。 防止单击在拖放时处于触发状态的最佳方法是什么? 我对可排序元素有这个问题,但是认为最好有一种通用拖放方法。 问题答案: 解决方案是添加单击处理程序,以防止单击在拖动开始时传播。然后在执行删除操作后删除该处理程序。最后的动作应该稍微延迟一点,以防止点击的发生。 可排序的解决方案:

  • 问题内容: 此处使用复选框状态更新文本框值。我用来确认取消选中的操作。如果用户选择“取消”,则复选标记会恢复,但会在确认前触发。 这会使事情处于不一致状态,并且选中复选框时文本框会显示false。 如何处理取消并保持文本框值与检查状态一致? 问题答案: 在JSFiddle中进行了测试,可以满足您的要求。这种方法的附加好处是,当单击与复选框关联的标签时,可以触发。 更新的答案: 原始答案:

  • 本文向大家介绍jQuery为DOM动态追加事件的方法,包括了jQuery为DOM动态追加事件的方法的使用技巧和注意事项,需要的朋友参考一下 处理一个列表绑定,因为是一个展示项目,没有使用复杂的插件,直接jsrender写了个模板,但是后面有一个操作按钮,去查看数据详情,想到了jquery使用on进行事件委托,然后就开搞 最初是这样写的: 当然这样是不起作用的,因为在document reday后,

  • 点击之后立马消失,click事件不会触发? https://codepen.io/perterhuan/pen/LYoxoGO 我想实现这样的效果 点击之后弹出选择框 点击选择其中一个选项之后,选择框立马消失。 尝试 借助于ant design的popover, trigger为focus,children为一个button, content为ant design List。 点击button(此