当我尝试将表单设置为清理时,脏表单会出错

时间:2013-12-18 16:17:45

标签: javascript jquery ajax jquery-plugins jquery-dirtyforms

我有一个表单,我正在尝试监控,以确定它何时成为" 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

1 个答案:

答案 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 );
};