Javascript 尝试将窗体设置为“清理”时,脏窗体出现错误

Javascript 尝试将窗体设置为“清理”时,脏窗体出现错误,javascript,jquery,ajax,jquery-plugins,jquery-dirtyforms,Javascript,Jquery,Ajax,Jquery Plugins,Jquery Dirtyforms,我有一个表单,我正试图监视它何时变为“脏”(已更改),这样我就可以启用“保存更改”按钮。这相当简单。在$(document).ready()部分,我在表单上启用了dirtyForms $(".dirtyForm").dirtyForms(); 然后,我从一个ajax调用加载表单,在同一个函数中,我将其设置为clean,然后开始调用一个函数来检查它是否脏 $(".dirtyForm").dirtyForms("setClean"); constant = setInterval(function

我有一个表单,我正试图监视它何时变为“脏”(已更改),这样我就可以启用“保存更改”按钮。这相当简单。在$(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>";
                        }}
                    ]
                });
            }
        });
    }

第一步是在更改表单中的任何内容(包括数据表)后调用
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字符串


您还需要检查插件是否正常工作。请尝试检查以下各项:

  • 插件是在jQuery之后添加的吗?-
  • 插件是否支持您的jQuery版本
  • 页面上是否包含多个jQuery副本?那会让事情变得疯狂。 阅读:

编辑:要获取stacktrace以查看调用facebox函数的内容,请执行以下操作:

$.facebox = function(){
    alert( new Error().stack );
};

当窗体变脏/变干净时,启用/禁用按钮的正确方法现在已发布在中。请注意,这仅适用于脏表单2.x

// Enable/disable the reset and submit buttons when the state transitions
// between dirty and clean. You will need to first set the initial button
// state to disabled (either in JavaScript or by setting the attributes in HTML).
$('form').find('[type="reset"],[type="submit"]').attr('disabled', 'disabled');
$('form').on('dirty.dirtyforms clean.dirtyforms', function (ev) {
    var $form = $(ev.target);
    var $submitResetButtons = $form.find('[type="reset"],[type="submit"]');
    if (ev.type === 'dirty') {
        $submitResetButtons.removeAttr('disabled');
    } else {
        $submitResetButtons.attr('disabled', 'disabled');
    }
});
另外,从错误消息中可以很清楚地看到,您使用的是默认的DirtyForms1.x行为,它使用FaceBox作为对话框,但是您的页面中没有对FaceBox的引用。您可以通过添加引用来解决此问题:

<script type="text/javascript" src="//cdn.jsdelivr.net/jquery.facebox/1.4.1/jquery.facebox.min.js"></script>

在Dirty Forms 2.x中,
false
现在是默认设置,因此无需添加对FaceBox的引用。

您得到答案了吗?您是否引用了FaceBox?插件默认使用它。错误消息与此线程中的错误消息非常相似:“当我调用ajax函数以加载包含更多信息的表单时”-代码是什么样的?@zeroflagL我添加了该函数。好吧,我尝试过,但似乎期待facebox继续提供一些信息。我更新了答案,提供了一些如何让插件工作的提示。这可能会让人头疼,但值得一读我引用的链接。我已经有了Facebox。我需要的是dirtyforms.js不尝试打开对话框的某种方式,因为我不需要它们,而且它们正在妨碍我。知道在哪里触发facebox是很重要的。在调用
dataTable()
期间是否调用了它?它是在Ajax响应/成功函数之前调用的吗?jQuery允许您为每个Ajax响应附加一个函数。()实际上,dataTable不是脏表单的一部分,因此它在脏表单之前还是之后都没有区别。表单中的部分正好位于注释//设置主字段之后。无论如何,谢谢你的帮助。我想我会发布第二个问题,关于如何阻止dirtyForms创建弹出框。
<script type="text/javascript" src="//cdn.jsdelivr.net/jquery.facebox/1.4.1/jquery.facebox.min.js"></script>
$.DirtyForms.dialog = false;