如何在动态元素上使用 preventDefault?

Posted

技术标签:

【中文标题】如何在动态元素上使用 preventDefault?【英文标题】:How to use preventDefault on dynamic elements? 【发布时间】:2016-02-15 03:12:45 【问题描述】:

我有一堆动态创建并添加到 div 的表单。每个表单的 id 也是动态创建的 - id 总是不同的,但它们都以...开头。

updateFRM_

我无法让 preventDefault() 工作 - 我不确定这是否是问题所在,或者语法是否不正确以至于 js 失败并重新加载。

为动态生成和动态命名的表单设置监听器的正确语法是什么?

$( "#updater" ).on( "submit", "form[id^='updateFRM_']", function(e)
 
    e.preventDefault();

感谢您的时间和帮助

【问题讨论】:

你的表单怎么会有多个id?它有#updater#updateFRM_ #updater 是否也是动态创建的?? .. 尝试 $('body') 而不是 $( "#updater" ) 我认为你的代码应该可以工作,前提是#updater 是一个静态元素。 IE。在加载 dom 时存在,是吗? 谢谢大家。动态 id 是通过 mustache 添加的,例如 id="updateFRM_432"。 #updater 是静态的 - 从一开始就是 html 页面的一部分。 【参考方案1】:

使用$(document) 选择器,您可以定位动态生成的元素。这是因为文档涵盖了 dom 而不仅仅是最初加载的 html。以下是您可以做什么的两个示例。这完全取决于您的代码以及您选择使用这两个代码的方式。

基于 ID

var formid = 'someformid';
$(document).on('submit', '#' + formid, function(e) 
    e.preventDefault();
    // Do your form stuff
    return false;
);

基于类

$(document).on('submit', '.my-form', function(e) 
    e.preventDefault();
    var formid = $(this).attr('id');
    // Do stuff with the formid 
    return false;
);

更新

return false; 不是必需的。我添加了它以防e.preventDefault() 失败。一些 jQuery 版本有不同的方法来阻止默认操作。使用return false; 做同样的事情。它执行上面的代码,然后返回false,而不是执行默认操作。

【讨论】:

谢谢彼得。我认为您的课程创意对我来说是最好的方式,但它仍然是自动提交的。我使用的类是 responsiveFormPadded updateAdForm,所以我的听众看起来像 $( "#updater" ).on('submit', '.responsiveFormPadded updaterForm', function(e) ... 我也试过 $(document).on('submit', '.responsiveFormPadded updaterForm', function(e) ... 没关系!!!发现我的错误 - 类部分应该是 '.responsiveFormPadded.updaterForm' - 谢谢!!!! 实际上 - 如果您能够扩展,请提出一个问题 Peter - 为什么我们需要返回 false;? 非常感谢彼得 - 现在一切正常,关于返回错误包含的附加解释也澄清了问题。【参考方案2】:

试试这个

 $(function()
    $("form[id^='updateFRM_']").on("submit", function(e)
        e.preventDefault();
    );
 );

【讨论】:

谢谢你,void - 我认为这也可以,但为了更简单,我已经从 Peter 那里删除了类选择器。【参考方案3】:

您应该为表单分配一个类,例如.prevent-default,并以这种方式操作它们。处理动态生成的 ID 非常麻烦,尤其是 CSS 选择器。

【讨论】:

谢谢凯文 - 已经走了。

以上是关于如何在动态元素上使用 preventDefault?的主要内容,如果未能解决你的问题,请参考以下文章

event.preventDefault 如何在无法停止的事件处理程序上工作?

Vue event.stopPropagation()和event.preventDefault()的使用

在 onWheel 事件中使用 event.preventDefault 时,如何规避 reactjs 中的“被动事件监听器”

Javascript event.preventDefault() 不适用于模态

怎么按元素id 使用js为页面元素绑定click()方法?

多种动态形式,e.preventDefault();未正确触发