我有一个基于ajax的应用程序(即获取新数据时没有页面'重新加载')。
最初,我想找到一种方法来防止在表单上存在未保存数据时导航。
我遇到了window.onbeforeunload
。
单击a
链接时(通过ajax加载内容,弹出/推送状态更改网址),这不起作用。
我添加了对a
链接的一些处理,但需要使用默认的window.onbeforeunload
来涵盖离开页面的标准方法(即手动输入新的URL或使用后退/前进按钮) 。
以下代码适用于:
a
链接但使用后退按钮(在Chrome和Firefox中)时不会触发window.onbeforeunload
。
下面的实现是否存在问题,或者使用后退按钮时是否window.onbeforeunload
无意触发?
var save_state = true;
// on entering data into an input field, the save button fades in
// and the save_state changes
$(document).on('keypress', '.class1 input', function() {
if (save_state) {
$(".save_button").fadeIn();
save_state = false;
};
// bind the click event to 'a' (overiding normal link behaviour)
$( "a" ).bind( "click", function(e) {
if (save_state == false) {
e.preventDefault();
alert("Save before leaving.");
// stop the other 'a' bound handlers from being triggered
e.stopPropagation();
return;
}
});
// also cover standard actions when user tries to leave page
// (back/forward or entering a new url manually etc)
window.onbeforeunload = function() {
return 'Save before leaving.';
};
});
// when clicking save, fade out the button and revert the save_state
$(document).on('click', '.save_button button', function(e) {
e.preventDefault();
$(this).parent().fadeOut();
save_state = true;
// 'unbind' onbeforeunload
window.onbeforeunload = null;
});
修改
阅读this post后,我认为它基于应用程序的ajax特性:
只要你留在你的应用程序中,因为它是一个单页应用程序, 它根据定义没有卸载,因此没有beforeunload事件。
所以我想我可能需要查看其他方法来触发后退/前进按钮上的事件。
答案 0 :(得分:0)
我试着在window.unload
上触发popstate
,但没有任何运气。
我最终更改了逻辑,以便一旦进行更改,它们就会保存在数据库中。
我使用selectize.js进行表单输入处理,只是添加了一些额外的调用。
在selectize.js
(here)中:
if ($target.hasClass('create')) {
self.createItem();
} else {
value = $target.attr('data-value');
成为:
if ($target.hasClass('create')) {
self.createItem();
$(".saved_message_div").fadeIn(400).delay(2000).fadeOut(400); // new
updateDatabaseFunction(); // new
} else {
value = $target.attr('data-value');
$(".saved_message_div").fadeIn(400).delay(2000).fadeOut(400); // new
updateDatabaseFunction(); // new
AND(here):
while (values.length) {
self.removeItem(values.pop());
}
self.showInput();
成为:
while (values.length) {
self.removeItem(values.pop());
}
$(".saved_message_div").fadeIn(400).delay(2000).fadeOut(400); // new
updateDatabaseFunction(); // new
self.showInput();
在我自己的脚本中,删除selectize.js
项的提示保持不变:
onDelete: function(values) {
confirm(values.length > 1 ? 'Are you sure you want to remove these ' + values.length + ' items?' : 'Are you sure you want to remove "' + values[0] + '"?');