【问题标题】:Ask for confirmation before user clicks on other links before data submission在用户点击其他链接之前要求确认,然后再提交数据
【发布时间】:2013-03-20 11:56:41
【问题描述】:

我的 html 页面上有一个用于更新一些自定义数据的表单。在提交表单之前,我想向用户询问确认消息,如果他更新了表单中的数据并单击同一 html 页面上的其他链接。

我是如何实现的:

我已经创建了布尔变量来保持用户是否更新了任何字段的状态。我已经使用jquery在html页面中绑定了所有anchor标签的click事件。这样当用户单击页面上的任何锚标记时,我将检查状态变量是否为真(值已更改)。如果是真的,我想停止重定向并要求确认。

到目前为止,我已经完成了。但问题是即使用户点击确认框的cancel,我也无法停止重定向。

这里是代码

$(document).ready(function(){
  GLOBAL_NAMESPACE.value_changed = false;
  $("[id^='id_']").live('change', function (){
      GLOBAL_NAMESPACE.value_changed = true;
  });
});



$('a').bind('click',function (e) {
    e.preventDefault();
    if (GLOBAL_NAMESPACE.customize_option_changed){
        var res = confirm('you have unsaved changes. Do you want to continue?');
        if(res){
            GLOBAL_NAMESPACE.customize_option_changed = false;
            $(this).click();
        }else{
            console.log('stay on same page...');
            // Problem: user redirects to the clicked link even if he reaches here
        }
    }
});

我的实现思路有问题吗?这段代码有什么问题?或者有没有更好的方法来做到这一点?

【问题讨论】:

  • 这没什么问题。
  • 在锚点上调用 click() 不会使浏览器跟随链接。使用window.location.href = $(this).attr('href')
  • $(this).click() 指的是您的绑定方法。看看这个答案stackoverflow.com/questions/3619214/…
  • @Flauwekeul:谢谢!我会做那个修改。但我的问题是,如果用户单击确认对话框的取消按钮,我无法停止重定向。

标签: jquery forms redirect


【解决方案1】:

这个fiddle 有效。

var GLOBAL_NAMESPACE = {};

$(document).ready(function(){
  GLOBAL_NAMESPACE.value_changed = true;
});

$('a').bind('click',function (e) {
    e.preventDefault();
    if (GLOBAL_NAMESPACE.value_changed){
        var res = confirm('you have unsaved changes. Do you want to continue?');
        if(res){
            window.location.href = $(this).attr('href');
        }else{
            console.log('stay on same page...');
        }
    }
});

我改变了几件事:

  1. $(document).ready() 中,您正在设置GLOBAL_NAMESPACE.value_changed,在bind() 函数中,您正在读取GLOBAL_NAMESPACE.customize_option_changed
  2. 根据您的 jQuery 版本,live() 方法将替换为 on()。我完全删除了这段代码,因为为了举例,我希望 GLOBAL_NAMESPACE.value_changed 为真。
  3. 如果用户在离开页面后确认离开页面,则无需将GLOBAL_NAMESPACE.value_changed 设置为 false :)
  4. 就像我在 cmets 中所说:我将 $(this).click(); 替换为 window.location.href = $(this).attr('href');

【讨论】:

  • 我同意你的第三点。但是现在,如果用户点击任何链接,无论他是否更改了表单数据,都会询问确认信息。我认为在 document.ready 内部我们应该将它初始化为 false;还缺少更新value_changed 变量。但无论如何,这并不能解决问题。因为e.preventDefault() 并没有停止点击事件的执行。(这是我的猜测。并且非常确定);无论如何,感谢您的回答。 :)
  • 您是否忽略了第 2 点?为了举例,我删除了整个 live() 块。但是here's a fiddle 没有删除该代码。请注意,您可能需要将live() 替换为on(),具体取决于您的jQuery 版本。让我知道这是否有效。
  • 好吧。我尝试使用on 而不是live。但是无论从确认对话框中选择什么选项,都会重定向到单击的链接。
  • 另一个updated fiddle,这次是输入。仍然可以在这里使用...您可以添加所有相关的 HTML 吗?你有错误吗?您使用的是什么版本的 jQuery?还可以尝试在代码的各个部分记录GLOBAL_NAMESPACE.value_changed 的值。
  • 你的答案是正确的。事实上,我的一些 a 标签是基于 ajax 工作的。所以产生了两个点击事件。无论如何,ajax 请求都被调用了。我修好了它。非常感谢您的耐心。 :)
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多