【问题标题】:Event not get triggered after replacing with JQuery replaceWith()?用 JQuery replaceWith() 替换后没有触发事件?
【发布时间】:2012-08-06 20:24:31
【问题描述】:

场景

我通过 JQuery ajax 调用获取页面,并显示为弹出窗口。我这样做的原因是该页面也可以在没有 javascript 的情况下访问。该页面本身包含一些下拉列表和按钮。在禁用 javascript 的版本中,通过将所选值传入和传出使用 php 的服务器来维护页面的状态。因此我打算对 javascript 做同样的事情,在这种情况下,以前的 html 元素需要替换为 ajax 响应。我在网上进行了广泛的搜索,但无能为力。

问题

替换后,元素丢失事件数据,

如何保存或重新绑定与之关联的事件?

我一直在尝试实现的代码是

    $('#search-main a').on('click', function(e){
        e.preventDefault();
        $('#search-advanced').remove();
        var target = $(this).attr('href');
        var res = $.get(target, function(data){
            $('body').append($(data).find('#search-advanced'));
            $('#search-advanced').addClass('row reveal-modal');
            $('#search-advanced')
            .css('top', 80)
            .css('border-radius' , '5px')
            .css('padding-left' , '0px')
            .css('padding-right' , '0px');

            $('#search-advanced input[name="select_filter"]').remove();
            $('#search-advanced .custom.dropdown').on('change', function(){
                $('#search-advanced form').trigger('submit');
            });                 

            $('#search-advanced form').on('submit', function(e){
                e.preventDefault();
                var params = $('#search-advanced form').serialize();
                $.get(target, params, function(data){
 // This is where I'm encountering the problem
 // The first time it works fine, 
 //     but for the second time the change event not get triggered
                    $('#search-advanced form').replaceWith($(data).find('#search-advanced form'));
                    $('#search-advanced input[name="select_filter"]').remove();
                    console.log($(data).find('#search-advanced .custom.dropdown'));
                });
            });

            $('#search-advanced').append('<a class="close-reveal-modal">&#215;</a>');
            $('#search-advanced').reveal({
                animation: 'fade', 
                closeOnBackgroundClick: false
            });
        });
    });

我不确定这种方法的优雅性,任何解决问题的建议或不同的方法都将非常感谢。

我已经尝试了以下链接

【问题讨论】:

  • 您似乎正在破坏绑定事件处理程序的原始form。很自然,表单元素消失了,处理程序也消失了。你真的需要像那样彻底破坏形式吗?你是用其他的替换它,还是只是想重置它?
  • 为什么要标记它 PHP?已删除。
  • @TWickz:不,live() 很糟糕。使用.on 是对的,但委托版本可能会更好,这取决于最终需要什么。
  • @amnotiam :不推荐使用 live 是的。但“坏”我不太确定。但是,如果您使用的是旧版本的 jquery,jquery 网站上的建议是使用 .delegate()。有些情况下 live() 对我有用,而 on() 没有:)
  • @TWickz:好吧,也许“坏”有点强,但我会说最好避免弃用 API,以及文档范围的事件委托。 .on 方法基本上可以做所有.live() 可以做的事情,包括将所有处理程序绑定到document,就像.live() 所做的那样。

标签: javascript jquery replacewith


【解决方案1】:

我不确定你为什么要破坏原始表单。如果您只需要重置它,可能有更好的方法。

但鉴于您正在销毁表单,因此也销毁了它的处理程序,您可以将处理程序绑定到#search-advanced 元素,并使用.on 的事件委托签名。

  // v--event is bound here          v--and will trigger on the form element
$('#search-advanced').on('submit', "form", function(e){
    e.preventDefault();
    var params = $('#search-advanced form').serialize();
    $.get(target, params, function(data){
        $('#search-advanced form').replaceWith($(data).find('#search-advanced form'));
        $('#search-advanced input[name="select_filter"]').remove();
        console.log($(data).find('#search-advanced .custom.dropdown'));
    });
});

【讨论】:

  • 实际上我正在做的是,通过更改提交表单的下拉项,然后使用适合请求的附加数据呈现视图(以前的表单)。如果我成功找到仅替换新数据的方法,则不一定需要销毁该表单。您能否建议我一种重置表格的正确方法。我知道replaceWith() 破坏了处理程序,这就是为什么我问如何重新绑定?无论如何我会试试这个,谢谢。
  • @thujeevan:试试看,然后告诉我。关于将输入元素设置为新数据,只需选择每个单独的元素,并使用.val() 更新它。
  • 我使用$('#search-advanced form').html($(data).find('#search-advanced form').html()); 解决了这个问题,因为这不会破坏表单和处理程序,而$('#search-advanced').on('change', '.custom.dropdown' ,function(){}。谢谢你的代码在另一个地方帮助了我。
【解决方案2】:

尝试像这样绑定事件:

$(document).on('click', '#search-main a', function(ev){
    // your code
});

【讨论】:

  • 对不起,试着理解我的问题..无论如何我会尝试的。谢谢
猜你喜欢
  • 2014-03-25
  • 1970-01-01
  • 2014-11-29
  • 2011-07-29
  • 2012-06-16
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多