Javascript 禁止狩猎活动’;s&x201C;您已输入文本…”;警告

Javascript 禁止狩猎活动’;s&x201C;您已输入文本…”;警告,javascript,html,safari,Javascript,Html,Safari,在输入文本后,Safari会在关闭选项卡或窗口之前提示(?) 在某些情况下,作为一名web开发人员,这是不可取的——例如,当输入是一个实时搜索时,用户可能已经在窗口关闭时获得了他正在查找的结果,即使字段中仍然有文本 我如何才能让Safari知道特定输入中的文本不需要保护?似乎您可以通过在上启用之前卸载处理程序(即使是空的处理程序也可以)来禁用整个页面的此警告。例如,以下情况不会产生警告: <body onbeforeunload=""> <form method="ge

在输入文本后,Safari会在关闭选项卡或窗口之前提示(?)

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


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

似乎您可以通过在
上启用
之前卸载
处理程序(即使是空的处理程序也可以)来禁用整个页面的此警告。例如,以下情况不会产生警告:

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


我不确定这是故意的行为,还是一个bug。

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

$('.unimportant').live('blur', function(){
    var olddisplay = this.style.display;
    this.style.display = 'none';
    this.clientLeft; // layout
    this.style.display = olddisplay;
});
(尝试键入“不重要”字段,单击页面上的其他位置,然后关闭窗口)。

简言之:

  • 隐藏输入
  • 触发器布局
  • 显示输入
  • 您还可以更改输入的值、触发布局并将其更改回

    这里的一个限制是必须显式地清除输入。在这种情况下,它将变脏,直到
    模糊
    。这在我的情况下很有效,可能在许多其他情况下也很有效,因为在页面上的其他内容被操作(例如,点击链接)之前,输入将受到保护,不会意外关闭窗口。您可以选择在
    keyup
    上运行此功能,前提是您愿意在每次按下键时插入点闪烁的情况下生活


    我对更清洁的解决方案持开放态度。

    我发现我认为是解决这个问题的一个非常好的方法。当我使用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;
     }
    }
    

    我刚刚找到另一个解决方案,防止Safari在文本区域更改内容时显示“是否确实要重新加载此页面?”对话框

    事实证明,通过Javascript设置该值可以清除Safari的
    changed
    状态:

    $(document).on('blur', 'textarea', function() {
        var value = $(this).val();
        $(this).val('').val(value);
    });
    
    首先清除该值很重要,直接将其设置为已存在的内容是行不通的


    EDIT显然设置
    window.onbeforeunload
    为空函数仍然有效,但是
    $(window)。on('beforeunload',function(){})
    不起作用。

    如何让safari这样做?我想那是JSs
    onbeforeunload
    。我刚刚创建了一个文本区域,并在没有任何警告的情况下关闭了选项卡。如何重新创建?可以清除onbeforeunload事件中的文本字段。我不知道这是否有效,但听起来可能:)用谷歌试过,并尝试了我创建的其他输入。。。不行。你能发布你的HTML和JS吗?奥斯卡:看起来输入必须在一个有方法的表单中。因此,一个最小的测试用例看起来像
    。但是,我在Google和Stack Overflow上复制它并没有问题(我只是键入一些字母并尝试关闭窗口)。您是否已在Safari副本中禁用此警告?首选项没有GUI,但有一些实用程序和命令行示例说明如何禁用它。您使用的是哪个版本的Safari?赢还是麦克?不,我没有通过命令行禁用任何东西:\n让我知道@p--的建议是否有效,我会看看我是否能在我的机器上复制它,并提出解决方案这很好,+1。但是,我不想取消整个页面的警报,只是不重要的搜索类型输入。这可能会使Safari用户(可能已经习惯了此警报)更容易丢失数据。谢谢,Terry!这个解决方案唯一的问题是它只支持一个文本输入。通常,如果有多个输入,如果其中任何一个是脏的,则会显示警告-但在这种情况下,如果其中任何一个是干净的,则不会显示警告。