【问题标题】:jQuery reload the DOM?jQuery重新加载DOM?
【发布时间】:2012-06-04 16:56:49
【问题描述】:

我有一个页面,上面有一个按钮。当用户单击按钮时,它会动态呈现一个表单(即它不只是显示一个隐藏的表单......它完全是使用 jQuery 创建它)。

我的问题是新创建的表单不响应任何 jQuery 命令。这是我目前呈现的表单的代码。

$("#savenewlang").click(function(e) {
    console.log("savenewlang has been clicked");
});

所以当他们点击提交按钮但它没有运行时,它应该只是 console.log。

知道如何重新加载 DOM 或分配正确触发的实际事件吗?

【问题讨论】:

    标签: jquery dom


    【解决方案1】:
    $("#container").on('click', '#savenewlang', function(e) {
        console.log("savenewlang has been clicked");
    });
    

    这里#container 指向#savenewlang 的父元素,该元素在页面加载时属于DOM。


    要指定此事件.on(),您需要三个参数

    .on(eventName, target, callback);
    

    但对于普通绑定,它只需要两个参数

    .on(eventName, callback);
    

    阅读更多关于.on()


    剩余

    将所有代码放入

    $(document).ready(function() {
    
    });
    

    总之

    $(function() {
    
    });
    

    【讨论】:

    • 这很好用,但是我应该注意,除非你将它包含在 $(document).ready() 中,否则它不会起作用。 (很明显)但我错了第一次。
    【解决方案2】:

    基本上发生的情况是,当您动态地将内容添加到 dom 时,您必须手动将处理程序附加到添加的 dom 元素。但是,如果您使用 jquery on() 函数,则可以创建持久事件处理程序。利用事件在 dom 中冒泡的事实,当有人单击您的动态 dom 元素时,该元素没有用于单击的事件处理程序,事件将冒泡到 body 元素,其中 on() 函数将确定实际项目点击的是#savenewlang,然后调用你定义的函数(e){}。

    $("body").on('click', '#savenewlang', function(e) {
        console.log("savenewlang has been clicked");
    });
    

    语法是:

    $('#selector_or_id_of_static_element').on('event_type','#selector_for dynamic_content', function(e){ //callback});
    

    【讨论】:

    • 抱歉刚刚要添加一些注释
    【解决方案3】:

    当 DOM 元素尚不存在时,正在添加事件处理程序。您可以尝试将其放入函数中:

    function addEvent() {
        $("#savenewlang").click(function(e) {
            console.log("savenewlang has been clicked");
        });
    }
    

    现在动态添加表单后调用此函数。

    【讨论】:

      【解决方案4】:

      由于元素是动态呈现的,因此您需要使用 .delegate() 方法顶部分配函数,如下所示:

      $("body").delegate("#savenewlang", "click", function(e) {
          console.log("savenewlang has been clicked");
      });
      

      更多信息请参见参考资料:http://api.jquery.com/delegate/

      【讨论】:

      • 来自文档:从 jQuery 1.7 开始,.delegate() 已被 .on() 方法取代。.
      • @blender 被取代是否意味着它很快就会被删除?我们知道 .live 不会在 1.8 中存在,但我很确定 .delegate 会在 1.8 中存在并继续前进。
      • 取代的意思是代替。我敢肯定它最终会被删除,但即使没有明确给出那个日期,.on()真的那么难用吗?
      • @Blender 感谢指出,我忘了提到 .on() 方法。
      猜你喜欢
      • 2012-11-25
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2010-10-27
      • 2012-10-20
      相关资源
      最近更新 更多