我创建了这个脚本来提醒用户他们没有完成表单就离开了页面。当用户单击提交按钮时,脚本将被忽略。不幸的是,在我正在工作的网站上,一个新的页面没有加载表单提交,只是一个感谢信息出现在同一页面上(因此,在这一点上点击的任何链接仍然给出警告消息)。所以我希望做的是-取消这个脚本在表单提交。有人有什么想法吗?(语法请!)-我只有脚本级别的访问权限,我不能直接编辑提交按钮。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
var action_is_post = false;
$("form").submit(function () {
action_is_post = true;
});
window.onbeforeunload = confirmExit;
function confirmExit()
{
if (!action_is_post)
return 'Are you sure you want to leave this page?';
}
});
</script>
解决这个问题的一个方法是稍微改变一下你的策略。
您假设页面的访问者总是完成表单。然而,至少有一种情况下这是不正确的:在提交表单并重新加载页面后,这不再是正确的(现在是对页面的新访问,用户这次不会完成表单,因为它已经完成了)。
因此,改变你的策略,使消息默认为OFF,并且只有在用户做以下事情时才打开它:(a)单击任何表单字段(.focus()
事件),(b)离开表单字段(.blur()
事件),(c)更改元素的内容(.change()
事件)等。
例子:
<script>
var exit_message = false; //outside of document.ready
$(document).ready(function(){
window.onbeforeunload = confirmExit;
$('.formField').focus(function(){
exit_message = true;
});
$("form").submit(function () {
exit_message = false;
});
}); //END document.ready
function confirmExit() {
if (exit_message)
return 'Are you sure you want to leave this page?';
}
}
</script>
对于上面的示例,请注意至少有一个表单字段(如果您愿意,也可以是全部)应该具有formField类。例如:<input id="first_name" class="formField" type="text" />
进一步的想法(回应评论):
如果您需要记住最后一个页面交互的状态(例如,用户已经提交了表单,并且您希望为以后的每个页面交互记住这一点),您可以使用PHP $_SESSION
超全局变量。
$_SESSION是一个数组变量,你可以为它创建新的关联元素。是特殊的,因为(a)它是PHP内置的,(b)它对每个访问该页面的访问者都是唯一的。
要使用这个超全局变量,您必须通过在脚本的最顶部放置session_start();
来启用它。通常,session_start()
必须出现在任何其他内容之前,当然在任何数据/标头输出到页面之前。这样的:
<?php
session_start();
//carry on as usual
此指令必须位于每个使用$_SESSION变量的 PHP页面的顶部。
现在,您应该使用$_SESSION变量,而不是使用全局变量(例如$exit_message = 1)。我们把它命名为"form_submitted": PHP:<?php
session_start();
//Note: you may have to use == false /or/ === false... Please test/research
if ( !isset($_SESSION['form_submitted']) ){
$_SESSION['form_submitted'] = 0;
}
if ( $_SESSION['form_submitted'] == 0 ) {
echo '<input type="hidden" id="stored_state" value="0" />';
}
jQuery/javascript:
function confirmExit() {
if ( $('#stored_state').val() == 0 )
return 'Are you sure you want to leave this page?';
}
}
解释上面的代码:
如果用户以前从未访问过该页面,则会话变量不存在。在这种情况下,创建它并将value设置为0。
PHP变量不能从jQuery访问(除非你使用ajax)。因此,在完成页面输出之前,添加一个隐藏的输入字段,用于存储PHP变量的值。jQuery/javascript可以访问隐藏字段的值,瞧!
注意:在您的表单处理中,(在PHP页面的顶部,我相信您提到过),您应该切换var值。也就是说,当表单已经提交时:
<?php
//At the part where you deal with the form submission data:
$_SESSION['form_submitted'] = 1;
在这里阅读更多关于$_SESSION
变量的信息:
TiZag on Sessions
DevShed会话
Inside Sessions
会话变量解释
没有文件访问,这是无法完成的。使用focus()绑定输入字段是最好的解决方案。