我有一个表单,我正在尝试监控,以确定它何时成为" Dirty" (已更改),以便我可以启用“保存更改”按钮。这很简单。在$(document).ready()部分中,我在表单上启用了dirtyForms。
$(".dirtyForm").dirtyForms();
然后,我从ajax调用加载表单,并在同一个函数中,我将其设置为clean,然后开始调用函数来检查它何时变脏。
$(".dirtyForm").dirtyForms("setClean");
constant = setInterval(function(){checkDirty()}, 500);
这是我的功能,以检查它何时变脏。顺便说一句,如果有人知道更好的方法来做这个部分,请告诉我。
function checkDirty(){
if ($.DirtyForms.isDirty()){
$(".saveDirtyForm").removeAttr("disabled");
$(".resetDirtyForm").removeAttr("disabled");
console.log("Dirty...");
clearTimeout(constant);
}
}
你会注意到在checkDirty函数中,它有clearTimeout(常量)来阻止函数在表单变脏之后不断重复。到目前为止一切正常。按钮保持禁用状态,直到我更改某些内容然后几乎立即启用。当我回想起用于加载具有更多信息的表单的ajax函数时,问题就出现了。当它重置表单时,它会在设置为清理时出错。它说,
Uncaught TypeError: Object function ( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
} has no method 'facebox'
此错误发生在jquery.dirtyForms.js文件中。它不会将表单设置为清理并再次启动监视功能。有没有人知道我做错了什么?
以下是zeroflagL询问的功能。
function getOrderDets(id){
$.ajax({
url: DONEP+"blueBlob/donors/"+donorID+"/orders/"+id,
type: "GET",
dataType: "json",
success: function(data){
console.log(data);
dataSec = data.main.aResultData[0];
//Clear Fields
$("#orderIdTag").text('');
$("#orderNum").val('');
$("#doPlaced").val('');
$("#doShip").val('');
$("#dTrack").val('');
$("#doNote").val('');
//Set Main fields
$("#orderIdTag").text(dataSec.OrderID);
$("#orderNum").val(dataSec.OrderNumber);
$("#doPlaced").val(dataSec.OrderDate);
$("#doShip").val(dataSec.ShipDate);
$("#dTrack").val(dataSec.TrackingNumber);
$("#doNote").val(dataSec.OrderNote);
//Clean Dirty Form
$(".dirtyForm").dirtyForms("setClean");
constant = setInterval(function(){checkDirty()}, 500);
//Set Table
$(".orderDetTable").dataTable({
aaData: data.array,
"bAutoWidth": false,
"bDestroy": true,
"aoColumnDefs" : [
{"sWidth" : "13%", "sTitle" : "Quantity", "mData" : "Quantity", aTargets : [0]},
{"sTitle" : "Code", "mData" : "Code", aTargets : [1]},
{"sTitle" : "Amount", "mData" : "Amount", aTargets : [2]},
{"sWidth" : "6%", "sTitle" : "", "mData" : "OrderDetailsID", aTargets : [3], "mRender" : function(data, type, full){
return "<a href='#'><i class='glyphicon glyphicon-pencil orderDetEdit' id='"+data+"'></i></a>";
}}
]
});
}
});
}
这是facebox调用的堆栈跟踪。
$.facebox@http://dev.mysite.info/details.php?id=63#:540
.DirtyForms.dialog.fire@http://dev.mysite.info/assets/js/jquery.dirtyforms.js:25
bindFn@http://dev.mysite.info/assets/js/jquery.dirtyforms.js:421
aBindFn@http://dev.mysite.info/assets/js/jquery.dirtyforms.js:311
jQuery.event.dispatch@http://dev.mysite.info/assets/js/jquery.js:5095
jQuery.event.add/elemData.handle@http://dev.mysite.info/assets/js/jquery.js:4766
答案 0 :(得分:2)
第一步是在更改表格中的任何内容后调用setClean
,包括数据表。
如果只是错误,那么这是一个黑客攻击。如果您处于截止日期之前,这将帮助您进行调试:
if ( typeof $.facebox !== 'function' )
{
$.facebox = function(){
var console = window['console'];
if ( console && console.error ){
console.error( 'Warning: $.facebox() was called', arguments );
}
return $();
}
}
另一个提示:如果您不止一次包含相同的jQuery库,那么您的插件可能无法正常工作。
要解决这个问题,请使用以下方法在代码库中搜索所有jquery实例:
grep -o 'jquery:[^"]*"1\....' -R *
这将搜索jQuery.fn.version字符串。
您还需要检查插件是否正常工作。请尝试检查以下内容:
编辑:要获得堆栈跟踪以查看调用facebox函数的内容:
$.facebox = function(){
alert( new Error().stack );
};