【发布时间】: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">×</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