Грязные формы дают ошибку, когда я пытаюсь установить чистую форму
У меня есть форма, которую я пытаюсь отслеживать, чтобы увидеть, когда она становится "грязной" (измененной), так что я могу затем включить кнопку "Сохранить изменения". Это довольно просто. В разделе $(document).ready() я включаю в своей форме dirtyForms.
$(".dirtyForm").dirtyForms();
Затем я загружаю форму из вызова ajax, и внутри той же функции я устанавливаю ее для очистки, а затем начинаю вызывать функцию, чтобы проверить, не загрязнена ли она.
$(".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
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.
Вы также должны проверить, что плагин работает. Попробуйте проверить следующее:
- Добавлен ли плагин после jQuery? - плагин JQuery не работает
- Поддерживает ли плагин вашу версию jQuery? - Почему плагин лайтбокса JQuery у меня не работает?
- Включено ли более одной копии jQuery на страницу? Это может привести к сумасшествию. Читайте: jQuery в виджете
РЕДАКТИРОВАТЬ: Чтобы получить трассировку стека, чтобы увидеть, что вызывает функцию facebox:
$.facebox = function(){
alert( new Error().stack );
};
Правильный способ включить / отключить кнопки, когда форма грязная / чистая, теперь опубликована в официальной документации. Обратите внимание, что это работает только с Dirty Forms 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');
}
});
Кроме того, из вашего сообщения об ошибке довольно ясно, что вы используете стандартное поведение Dirty Forms 1.x, в котором в качестве диалогового окна используется FaceBox, но на вашей странице нет ссылки на FaceBox. Вы можете исправить это, добавив ссылку:
<script type="text/javascript" src="//cdn.jsdelivr.net/jquery.facebox/1.4.1/jquery.facebox.min.js"></script>
Кроме того, вы можете использовать любой диалог, который вы хотите, установив $.DirtyForms.dialog
свойство, или вы можете установить его в false, чтобы использовать диалоговое окно браузера по умолчанию.
$.DirtyForms.dialog = false;
В грязных формах 2.х, false
теперь является настройкой по умолчанию, поэтому нет необходимости добавлять ссылку на FaceBox.