【问题标题】:How to reattach event bindings after DOM is completely changed [duplicate]DOM完全更改后如何重新附加事件绑定[重复]
【发布时间】:2023-03-27 06:25:01
【问题描述】:

我在一个 C# Razor 网站上工作,我正在从一个 boostrap 模式发布,然后返回一个新的视图和模型。要使用响应重新加载整个页面,我在此代码块中使用以下行。

$("html").html(响应);

 function addDevice(e) {
        e.preventDefault();
        var ID = $("#txtNewDeviceID").val();
        var Name = $("#txtNewDeviceName").val();

        $.post('@Url.Action("AddDevice", "Devices")', { 'DeviceID': ID, 'DeviceName': Name }, function (response) {
            $('#newDeviceModal').modal('hide');
            $("html").html(response);
            AttachBindings();
        });
    }

这是 AttachBindings() 背后的代码:

function AttachBindings() {
        $(document).on('click', 'table tr', {}, tableClick);
        $(document).on('keyup', '#search', {}, search);
        $(document).on('click', '#btnAdd', {}, function (e) {
            addDevice(e);
        });
        $(document).on('click', '#btnRemove', {}, function (e) {
            removeDevice(e);
        });
        $(document).on('click', '#btnUpdate', {}, function (e) {
            updateDevice(e);
        });
    }

不幸的是 AttachBindings() 从未被命中,我似乎无法找到重新附加这些事件的方法。唯一似乎有效的事件是附加到#search 的keyup。有关如何解决此问题的任何想法?

【问题讨论】:

  • 不需要调用AttachBindings(假设您在页面第一次加载时调用了它)-您已经在使用事件委托。但是,用响应重新加载整个页面是什么意思?如果您尝试重新加载页面,那么使用 ajax 将毫无意义
  • 我需要刷新整个页面,因为我需要返回一个新的视图和模型。通常在 C# razor 中使用 @url.action(),但由于这是从模式中发生的,因此我必须使用 $.Post() 来执行操作。
  • 对不起,你没有任何意义。如果您想完全刷新页面(您在 POST 方法中进行正常提交和重定向),则不要使用 ajax。而您刚刚替换了当前页面,并在此过程中删除了您的 AttachBindings 函数,使其不再存在 - 所以它当然不会执行。

标签: javascript c# jquery asp.net-mvc razor


【解决方案1】:

尝试使用 live 函数并在 document.ready 上调用它

根据LIVE 的文档中提供的详细信息:

描述:为所有匹配的元素附加一个事件处理程序 当前选择器,现在和将来。

因此,即使稍后在 DOM 中添加一个元素,该事件也会由该元素触发

而对于ON,它只会被添加到当前元素中:

描述:为一个或多个事件附加一个事件处理函数 到选定的元素。

因此,在文档准备好后调用一次并使用 bind 或 live 绑定事件将为您带来魔力。

【讨论】:

  • live() 方法在 jQuery 1.7 版中被弃用,并在 1.9 版中被删除。请改用 on() 方法。
【解决方案2】:

今天早上我检查了两次,事件正在按照我的方式进行。真正的问题是,如果 DOM 已更新,我在页面上的引导模式将不起作用。看来我需要重新连接 data-toggle 和 data-dismiss 事件。我猜引导程序会在页面首次加载时在后台执行此操作。

根据 JQuery 文档,不推荐使用 .Live 方法。

从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用 .on() 附加事件 > 处理程序。旧版本 jQuery 的用户应该优先使用 .delegate() >to .live()。

另外,AttachBindings 也不需要多次调用。我的代码更新现在看起来像这样:

function addDevice(e) {
        e.preventDefault();
        var ID = $("#txtNewDeviceID").val();
        var Name = $("#txtNewDeviceName").val();

        $.post('@Url.Action("AddDevice", "Devices")', { 'DeviceID': ID, 'DeviceName': Name }, function (response) {
            $('#newDeviceModal').modal('hide');
            $("html").html(response);
        });
    }

【讨论】:

  • 请编辑您的问题以添加任何其他信息。答案只是为了,嗯,答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2012-03-01
  • 2020-04-21
  • 2011-12-17
相关资源
最近更新 更多