【问题标题】:jQuery script doesn't work without an alertjQuery 脚本在没有警报的情况下无法工作
【发布时间】:2013-09-04 18:50:18
【问题描述】:

我有一个使用 jquery 的脚本,但我在下一部分遇到了问题:

        $("#botonAgregar").click(function() {
            $.ajax({
                type: "GET",
                url: $(this).attr('href'),
                success: function(html) {
                    $("#dialogDiv").html(html);
                    $("#dialogDiv").dialog('open');
                }
            });
            alert();
            $("a[type='submit']").click(function() {
                var formName = $(this).attr("nombreform");
                var formSelector = "form#" + formName;
                $(formSelector).submit();
            });
            return false;
        });

它按原样工作,但如果我删除“alert();”它不会将点击事件添加到 $("a[type='submit']") 对象。有什么问题?

【问题讨论】:

  • Ajax 是异步的。成功回调是有原因的,使用它。
  • 想象一下这个 ajax 请求需要三秒钟。在第二个中,您发送 ajax 请求。在第二个第二个,您将点击事件绑定到所有设置了 type 属性以提交的锚标记,然后在第二个第三个您添加了一个带有 type 属性设置为提交的锚元素。添加警报会在添加元素后发生事件绑定,因为您单击确定需要多长时间。

标签: javascript jquery web dialog click


【解决方案1】:

它不会将点击事件添加到 $("a[type='submit']") 对象

是的。但是,如果在 AJAX 调用期间添加了更多这些元素,那么在将这些新元素添加到 DOM 之后,您需要将处理程序重新添加到这些新元素中。目前您没有这样做,因为代码您对.ajax() 的调用发生在之前 AJAX 调用完成。这是因为根据定义,AJAX 是异步的。 可能 AJAX 调用在稍后的代码执行之前完成,但不能保证。 (对于紧随其后的代码,这种可能性极小。)

您的 success 处理程序在 AJAX 调用完成时被调用,因此这是执行此操作的好时机:

$("#dialogDiv").html(html);
$("#dialogDiv").dialog('open');
$("a[type='submit']").click(function() {
    var formName = $(this).attr("nombreform");
    var formSelector = "form#" + formName;
    $(formSelector).submit();
});

但是,有更好的方法来做到这一点

您使用的方法的一个问题是您将一遍又一遍地将处理程序重新添加到相同的元素。当您真的只需要一个时,您还向许多元素添加了相同的处理程序。看看the jQuery .on() function。本质上,它所做的是将单个处理程序添加到目标元素的公共父元素,然后根据目标元素选择器过滤事件。所以你只需要添加一次处理程序:

$(function () {
    $(document).on('click', 'a[type=submit]', function () {
        var formName = $(this).attr('nombreform');
        var formSelector = 'form#' + formName;
        $(formSelector).submit();
    });
});

在这种情况下,我使用document 作为公共父级,尽管任何其他父级都可以。 (body 标记,包含所有目标元素的 div 等。它只需要是一个公共的父元素,在 DOM 的整个生命周期中都不会改变。)

【讨论】:

  • “是的。” 如果它们不存在,则不会,:p
  • @KevinB:这并没有区别。它在代码执行时将处理程序添加到所有匹配的元素。如果没有任何匹配的元素,那么,没有任何事件需要处理。
  • 谢谢,一旦我记得它是“异步的”,一切都是显而易见的。由于我在 DOM 中只有一两个 a[type=submit] 元素,因此在对话框打开时处理事件没有问题。
猜你喜欢
  • 2012-12-21
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多