即使在使用empty()清除DOM之后,jquery函数也会执行两次
jquery function executing twice even after clearing the DOM using empty()
当WorkOrder.jsp加载时,它将加载WorkOrders.jsp 中定义的schedule.jsp选项卡
当Schedule.jsp加载时,它会在时间表页面中获取记录并打印,该页面由两个引导下拉按钮和一个链接组成,在该链接上它会将您带到另一个页面。单击schedule.jsp中的一个链接,它清空anythingdiv并加载SubcaseMain.jsp.
Subcasemain.jsp包含后退按钮,点击后清空任意div并加载WorkOrder.jsp。所以当我点击schedule.jsp中的链接时,它会两次点击WorkOrder.jsp中的(.delete(函数并加载该函数存在的模态X次数。我已经检查了div,它已经清空了。那么,为什么函数要执行多次呢?
标记在调用empty方法后是清楚的,但它仍然在内存中,我检查了firebug脚本选项卡,它在其中创建了多个javascript源。为什么即使调用了空方法,js也没有被清除??
LoginMenu.jsp
<link href="css_harish/demo.css" rel="stylesheet" />
<link href="css_harish/jquery.mmenu.all.css" rel="stylesheet" />
<link href="css_harish/bootstrap-datetimepicker.min.css" rel="stylesheet" />
<link href="css_harish/bootstrap-paper.min.css" rel="stylesheet" />
<script src="js_harish/jquery-2.2.4.min.js"></script>
<script src="js_harish/jquery.mmenu.all.min.js"></script>
<script src="js_harish/bootstrap.min.js"></script>
<script src="js_harish/modernizr.js"></script>
<script src="js_harish/bootbox.min.js"></script>
<script src="js_harish/validator.js"></script>
<script src="js_harish/moment.min.js"></script>
<script src="js_harish/bootstrap-datetimepicker.min.js"></script>
<link href="css_harish/Loader.css" rel="stylesheet" />
<div class="content" id="whatever"></div>
$(document).ready(function () {
$(function () {
$("#whatever").empty();
$("#whatever").load("WorkOrders.jsp");
});
});
WorkOrders.jsp
$(document).ready(function() {
$("#schedule .showbox").show();
$("#schedule").load("Schedule.jsp");
});
$(document).on("click", ".delete", function(e) {
//delete the appointment
e.preventDefault();
alert("delete");
$("#edit_objid").val($(this).data('id'));
var objid = $("#edit_objid").val();
bootbox.confirm({
title: 'Delete Appointment',
message: 'Are you sure you want to delete this Appointment. ?',
buttons: {
'cancel': {
label: 'Cancel',
className: 'btn-default pull-left'
},
'confirm': {
label: 'Delete',
className: 'btn-danger pull-right'
}
},
callback: function(result) {
if (result) {
url="deleteAppointment.action?objid="+objid;
$.ajax({
type: 'POST',
cache: false,
async: true,
url: url,
dataType: 'json',
success: function(data) {
if(typeof data['EXCEPTION']!="undefined"){
bootbox.alert("Exception Occurs while deleting the appointment :"+data.EXCEPTION);
}else{
bootbox.alert("Deleted Successfully.");
$("#containerid").html('');
$("#containerid").html($(".showbox").html());
getSchedule();
}
}
});
}
}
});
});
Schedule.jsp
$(document).on("click", ".opensubcase", function() {
var id_number=$(this).text();
$("#whatever").empty();
$("#whatever").load("SubCaseMain.jsp?id_number="+id_number);
});
SubcaseMain.jsp
<span style="float:left" data-toggle="tooltip" data-placement="right" title="Go Back"><img
style="float: left" class="back" src="back.png" width="35px"
height="35px" /></span>
$(document).on("click", ".back", function() {
$("#whatever").empty();
$("#whatever").load("WorkOrders.jsp");
});
我的猜测是,您正在为后退按钮绑定多个单击事件,请尝试使用$(document).one("click", ".back", function() {});
而是
$(document).on("click", ".back", function() {});
示例:
$(document).one('click', '#clickOnce', function(){
alert('clicked');
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id='clickOnce'>click me</button>
这与如何解析脚本并将其放入页面DOM有关。一旦脚本标记被解析并执行,删除它并不会删除它。
请参阅此标记和代码,例如:
标记:
<div class="wrapper">wrap it up
<button id="howdy">
howdy
</button>
<div id="whatever">
<div class='inside'>insidetop</div>
<script>
$(document).ready(function() {
$('#howdy').on('click', function() {
console.log('howdyclick from org');
})
});
</script>
<div class='inside'>inside</div>
</div>
<button id="test">
test
</button>
</div>
代码:(不在标记中(
console.clear();
var testthing = "<scr"+"ipt>$(document).ready(function(){$('#howdy').on('click', function(){console.log('howdyclick from test');});});</scr"+"ipt> <div class='inside'>inside</div>";
$(document).ready(function() {
$('#howdy').on('click', function() {
console.log('howdyclick from outside');
})
});
$('#test').on('click', function() {
$('#whatever').empty();
$('#whatever').html(testthing);
});
现在,当您执行此操作时,您可以单击"howdy"按钮。当您在控制台中获得第一行时,请注意第二行来自外部处理程序。
howdyclick from org
howdyclick from outside
现在单击"测试"按钮,它会像您所做的那样放置新脚本和标记。现在再次单击"howdy"按钮-查看您仍然从"whatever"中的原始代码中获得响应,该代码现在有了新的标记和脚本-然后添加了第三行。所以你看到原来的仍然存在并执行。
howdyclick from org
howdyclick from outside
howdyclick from test
我把小提琴放在一起,这样你就可以在这里亲眼看到了https://jsfiddle.net/8fwfoc5b/
- 等待回调函数执行
- 暂停函数执行流程,直到ajax请求完成
- Bigcommerce-是否可以在函数执行后更改文本
- 如何对jquery中的未命名函数执行.call()
- 等待函数执行后再继续
- mootools类型的函数将文本作为函数执行
- 停止从另一个函数执行Javascript函数
- Jquery回调函数执行多次
- 如何使即兴 jquery 暂停当前函数执行
- JavaScript 双函数执行
- 来自函数 Javascript 的 NaN 返回值 ||函数执行顺序
- 如何在 JS 中调用 2 次或更多次时延迟函数执行
- 函数执行的次数超出预期
- JS中函数执行错误
- 为什么这个函数执行了两次
- 从子函数执行父函数;t更新父级'的属性
- 如何在jQuery函数执行's处于活动状态
- 使用javascript函数执行php文件
- jQuery函数执行顺序
- javascript中同步函数执行中的问题