【问题标题】:Suppress Safari’s “You have entered text…” warning?禁止 Safari 的“您已输入文本……”警告?
【发布时间】:2014-08-14 21:33:43
【问题描述】:

当文本输入到输入中时,Safari 会在关闭选项卡或窗口之前提供有用的 (?) 提示。

在某些情况下,作为 Web 开发人员,这是不可取的——例如,当输入是实时搜索时,用户可能已经得到了他正在寻找的结果,而窗口已关闭,即使字段中仍有文本。

如何让 Safari 知道特定输入中的文本不需要其保护?

【问题讨论】:

  • 我如何让 safari 做到这一点?我认为那是 JSs onbeforeunload。我刚刚创建了一个 textarea 并在没有任何警告的情况下关闭了选项卡。我该如何重新创建它?
  • 您可以清除 onbeforeunload 事件中的文本字段。我不知道这是否可行,但听起来可能:)
  • 用谷歌试了一下,并尝试了我创建的其他一些输入......不行。如果有的话,你能发布你的 HTML 和 JS 吗?
  • @Oscar:看起来输入必须在带有方法的表单内。所以,一个最小的测试用例看起来像<form method="get"><input></form>。但是,我在 Google 和 Stack Overflow 上复制它没有问题(我只是输入一些字母并尝试关闭窗口)。您是否有可能在您的 Safari 副本中禁用了此警告?该首选项没有 GUI,但有实用程序和命令行示例说明如何禁用它。
  • 您使用的是哪个版本的 Safari?赢还是 Mac?不,我没有通过命令行禁用任何东西:\让我知道@p--的建议是否有效,看看我是否不能在我的机器上重现它并提出解决方案跨度>

标签: javascript html safari


【解决方案1】:

您似乎可以通过在<body> 上使用onbeforeunload 处理程序来禁用整个页面的此警告(即使是空的也可以)。例如,以下不会产生警告:

<body onbeforeunload="">
    <form method="get"><input></form>
</body>

我不确定这是预期的行为还是错误。

【讨论】:

  • 这很好用,+1。但是,我不想杀死整个页面的警报,只是不重要的搜索类型输入。这可能会使 Safari 用户(可能习惯了此警报)更有可能丢失数据。
【解决方案2】:

我想我已经找到了解决这个问题的方法,尽管它毫无疑问是一个 hack(即,如果 Safari 改变了这个功能的实现方式,它可能会停止工作)。这里显示了一点 jQuery:

$('.unimportant').live('blur', function(){
    var olddisplay = this.style.display;
    this.style.display = 'none';
    this.clientLeft; // layout
    this.style.display = olddisplay;
});

Demo(尝试在“不重要”字段中输入,单击页面上的其他位置,然后关闭窗口)。

简而言之:

  1. 隐藏输入
  2. 触发器布局
  3. 显示输入

你也可以改变输入的值,触发布局,然后改回来。

这里的一个限制是必须明确地清理输入。在这种情况下,它会一直脏到blur。这在我的情况下效果很好,可能在许多其他情况下,因为输入将受到保护,不会意外关闭窗口,直到页面上的其他内容被操作(例如,单击链接)。如果您愿意忍受每次按下键时插入点的闪烁,您可以选择在 keyup 上运行它。

我愿意接受更清洁的解决方案。

【讨论】:

    【解决方案3】:

    我发现我认为是解决这个问题的一个很好的方法。当我使用 AJAX 提交表单时,我希望禁止显示警告。这是通过 onbeforeunload 完成的。

    window.onbeforeunload=function(e){}
    

    但在我提交后,我可能会进行其他更改,因此我希望再次显示警告。为此,我向表单元素添加了一个 keyup 处理程序。

    $('txtarea').onkeyup=dirty;
    

    dirty 所做的是检查输入字段是否已更改,然后我将 onbeforeunload 设置为 null。

    function dirty(e){
     if (e.srcElement.value != e.srcElement.defaultValue){
      window.onbeforeunload=null;
     }
    }
    

    【讨论】:

    • 谢谢,特里!这个解决方案的唯一问题是它只支持一个文本输入。通常,如果有多个输入,如果其中任何一个是脏的,就会显示警告 - 但在这种情况下,如果其中任何一个是干净的,则不会显示警告。
    【解决方案4】:

    我刚刚找到了另一种解决方案,可以防止 Safari 在 textareas 更改其内容时显示 “您确定要重新加载此页面吗?” 对话框。

    原来通过Javascript设置值清除了Safari的changed状态:

    $(document).on('blur', 'textarea', function() {
        var value = $(this).val();
        $(this).val('').val(value);
    });
    

    先清空值很重要,直接设置成已经是的内容是行不通的。

    编辑显然将window.onbeforeunload 设置为空函数仍然有效,但$(window).on('beforeunload', function() {}) 无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-21
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多