$(document).on("click",".prevIoUs",function()
{
$.ajax({
url: '<?PHP echo Config::get('URL'); ?>wizzard/personal_information',type: 'GET',success: function(data){
$('#tab2').html('');
$('#tab2').removeClass('active');
$('.tab_2').removeClass('active');
$('#tab1').html(data);
$('#tab1').addClass('active');
$('.tab_1').addClass('active');
}
});
});
$(document).on("click",".next",function()
{
$('#update_contact_information').on("submit",function()
{
$.ajax({
url: $(this).attr('action'),type: $(this).attr('method'),dataType: 'json',data: $(this).serialize(),success: function(data){
if(!data.success){
$.notify(data.error,{
className:'error',clickToHide: true,autoHide: true,globalPosition: 'bottom right'
});
$.ajax({
url: '<?PHP echo Config::get('URL'); ?>wizzard/employment_history',success: function(data){
$('#tab2').removeClass('active');
$('.tab_2').removeClass('active');
$('#tab2').html('');
$('#tab3').html(data);
$('#tab3').addClass('active');
$('.tab_3').addClass('active');
}
});
}else{
$.notify(data.success,{
className:'success',globalPosition: 'bottom right'
});
$.ajax({
url: '<?PHP echo Config::get('URL'); ?>wizzard/employment_history',success: function(data){
$('#tab2').html('');
$('#tab2').removeClass('active');
$('.tab_2').removeClass('active');
$('#tab3').html(data);
$('#tab3').addClass('active');
$('.tab_3').addClass('active');
}
});
}
}
});
return false;
});
$('#update_contact_information').trigger('submit');
});
我的标签:
<div class="panel-body">
<div id="rootwizard">
<div class="navbar">
<div class="navbar-inner">
<div class="container">
<ul class="nav nav-pills">
<li class="active tab_1"><a href="#tab1" data-toggle="tab"><?PHP echo System::translate("Personal information"); ?></a></li>
<li class="tab_2"><a href="#tab2" data-toggle="tab"><?PHP echo System::translate("Contact information"); ?></a></li>
<li class="tab_3"><a href="#tab3" data-toggle="tab"><?PHP echo System::translate("Employment history"); ?></a></li>
<li class="tab_4"><a href="#tab4" data-toggle="tab"><?PHP echo System::translate("Qualification history"); ?></a></li>
<li class="tab_5"><a href="#tab5" data-toggle="tab"><?PHP echo System::translate("Avatar"); ?></a></li>
</ul>
</div>
</div>
</div>
<div class="tab-content">
<div class="tab-pane active" id="tab1">
</div>
<div class="tab-pane" id="tab2">
</div>
<div class="tab-pane" id="tab3">
</div>
<div class="tab-pane" id="tab4">
</div>
<div class="tab-pane" id="tab5">
</div>
<ul class="pager wizard">
<li class="prevIoUs"><a href="javascript:;"><?PHP echo System::translate("PrevIoUs"); ?></a></li>
<li class="next"><a href="javascript:;"><?PHP echo System::translate("Next"); ?></a></li>
</ul>
</div>
</div>
和最初的电话:
<script>
$(function(){
$.ajax({
url: '<?PHP echo Config::get('URL'); ?>wizzard/personal_information',success: function(data){
$('#tab1').html(data);
}
});
});
</script>
解决方法
您要做的是在单击“下一步”按钮时简单地提交表单的内容.同时,此按钮不是表单的一部分,因此只需单击它就不会触发“提交”事件.所以你手动触发事件.
现在您的描述中有些奇怪的是,您的ajax请求在每次点击时都会加倍.通常,每次点击都会增加一个请求.请参阅我的小提琴here,这是您的代码的简化版本.
var form = $('form');
$(document).on('click','.next',function(){
form.on('submit',function() {//with every click one more handler is registered. Click the "click" link several times to see
alert('submit fired');
return false;
});
form.trigger('submit')
})
因此,问题出现了:你在哪里用$(document).on注册你的处理程序(“click”,“.next”,function()?你需要确保这个处理程序只注册一次.为此你可以将警报(‘注册处理程序’)放在代码中的这一行之前进行检查.
注册事件处理程序的正确顺序显示在此modified fiddle中.代码为:
var form = $('form');
$(document).on('click',function(){
form.trigger('submit')
})
form.on('submit',function() {//with every click one more handler is registered. Click the "click" link several times to see
alert('submit fired');
return false;
});
那么继续,你可以尝试我的建议,让我知道结果吗?
附:我不确定为什么你需要触发表单提交.对于您的ajax请求,您正在序列化表单并取消初始提交(您返回false;).因此,我建议完全避免使用“提交”事件,而只是在“点击”处理程序中完成所有工作.
更新(在下面的评论中添加更多信息后)
所以问题的第二部分是如下.每次“下一次”点击都会附加新的事件监听器,你正在替换你的标签的html,如$(‘#tab2’).html(data);,而且数据不仅包含标记,还包含js代码当你插入它时被执行(顺便说一下,我不知道它是这样工作的,这很好).我认为你所期待的是,一旦删除了标记(html),相应的事件监听器也将被删除.但实际情况并非如此.为什么?因为您使用以下代码开头的代码委托您的事件监听文档:
$(document).on("click",function()
这里$(文档)是你附加你的听众.我强烈建议您查看this original jquery explanation of event delegation,而不是详细说明.
那么你如何解决它?有几种不同的方式.可能最简单的一个(最少量的代码编辑)是在你执行.html(数据)之前删除你的事件监听器.另一种方式,也很简单,就是写
$('.next').on("click",function(),
正如你在qualification_history.PHP中所做的那样.这样,您将事件附加到元素本身,而不是文档.唯一的问题是,在执行此代码之前,您需要确保存在相应的DOM元素(因此您可以将代码放在标记之后).