2014-03-25 40 views
6

我已经做了大量的研究这个问题,但我似乎无法找到任何解决我的问题。Safari保存的密码覆盖自动完成=“关闭”形式

我在我的表单标签上设置了autocomplete =“off”,并且还有我的所有输入标签,但Safari继续在页面加载时将自动保存的密码输入到我的表单中,这导致了不希望的形式在我的JavaScript。

有什么想法?我已经尝试了各种各样的黑客行为,例如完全从代码中删除这些输入字段,然后使用javascript和setTimeout在几秒钟后将它们插入到页面中,但即使在Safari仍将其保存的密码投入到我的输入中。

我也尝试在我的标签中使用autocorrect =“off”和autocapitalize =“off”属性。

我已经试过的Javascript黑客就像这样(例如):

$(function() { 
    $('input').attr('autocomplete', 'off'); 
}); 

这样在加载页面上的每个输入字段有这个属性,然而野生动物园仍插入其保存的密码到田间地头。

是的,该网页使用html5文档类型(因为我知道自动完成不会没有它的工作)。

这里是我的代码:以上

- form_for @website, :html => {:class => 'fields', :autocomplete => 'off'}, :url => {:controller => 'signup', :action => 'connect'} do |form| 
    %h3 Enter URL 
    %ol.fields 
     %li 
     = form.label :url, "Website URL:" 
     = form.text_field :url, :placeholder => "Website URL", :autocomplete => "off", :class => "website_url" 
    %h3 Enter Credentials 
    - form.fields_for :authentication do |aa| 
     %ol.fields 
     %li 
      = aa.label :hostname, "SFTP/FTP Server:" 
      = aa.text_field :hostname, :placeholder => "SFTP", :autocomplete => "off" 
     %li 
      = aa.label :account, "Username:" 
      = aa.text_field :account, :placeholder => 'Username', :autocomplete => "off" 
     %li 
      = aa.label :password, "Password:" 
      = aa.password_field :password, :placeholder => 'Password', :autocomplete => "off" 

是HAML。这是一个红宝石应用程序。它将我的密码插入:帐户输入和密码输入。我已经试过包装我的“名字”部分:账号输入span标签,像这样:

User<span>n</span>ame 

,因为“名”字是用于自动保存的密码触发的,但Safari浏览器仍然抛出其保存的密码进入我的在尝试解决此问题之后形成。

我将不胜感激一些新的提示,我可以尝试。我发现迄今为止这个问题的一切,人们只是说“使用自动完成=”关闭。“我是,但它不工作!

此外,我一直在测试这与Safari 6.1.2,但有在浏览器检查的截图中,我确实知道autocomplete =“off”属性正在被添加到元素中:http://imgur.com/Sgqn7A4

+0

你确定['autocomplete =“off”'](http://stackoverflow.com/questions/3868299/is-autocomplete-off-compatible-with-all-modern-browsers)正在添加最终的HTML? – Blazemonger

+0

嗨,是的,当我检查Safari或任何其他浏览器中的元素时,我发现元素上的autocomplete =“off”属性正确。链接到浏览器的截图检查:http://imgur.com/Sgqn7A4 – user1138940

回答

6

看起来像Safari,并且其他人已经决定停止履行该属性。

https://discussions.apple.com/message/25149138#25149138

http://blog.gerv.net/2013/10/ie-11-ignoring-autocompleteoff

// Override Safari, Chrome and IE11 decision to ignore autocomplete: off 
// on form you wish to skip autocomplete, change all password fields to type=private 
// requires jQuery 

$(function() { 
    $('input[type="private"]').focus(function(e){ 
    $(this).prop('type', 'password'); 
    }); 
    $('input[type="private"]').parents('form').submit(function(){ 
    $(this).find('input[type="password"]').hide().prop('type', 'private'); 
    }); 
}); 
+0

这似乎工作 – Dex

+0

在Firefox中,这可以防止存储的密码出现在页面加载,但只要我点击到其中一个字段,它把它的密码。 – DiMono

-1

Safari已经存储了数据。一旦浏览器存储了数据,autocomplte =“off”不起作用。 也许你可以去首选项=>自动填写=>编辑(用户名和密码),并删除你已经放在那里,然后再试一次。

希望它能帮助:)

0

@ t_itchy的解决方案在Firefox中失败,因为它起初阻止被输入的值,但只要你给一个密码字段焦点,密码被添加到它。以下解决方案是从他编辑的,并操纵maxlength属性以防止出现密码。此外,由于Firefox在模糊密码字段时表现异常,因此如果密码字段为空,它还会将密码字段恢复为私密。

// Override Safari, Chrome and IE11 decision to ignore autocomplete: off 
// on form you wish to skip autocomplete, change all password fields to type=private 
// requires jQuery 

// External function for removing maxlength restriction - apparently required 
function removemaxlength(me) { 
    window.setTimeout(function() {me.prop('maxlength',100)},100); 
} 

$(function() { 
    $('input[type="private"]').focus(function(e){ 
     $(this).prop('maxlength',0).prop('type', 'password'); 
     removemaxlength($(this)); 
    }).blur(function(e){ // When leaving an empty field ONLY, revert to private 
     if (!$(this).val()) $(this).prop('type', 'private'); 
    }); 
    // This appears unnecessary, left as comment for completeness 
    // $('input[type="private"]').parents('form').submit(function(){ 
    // $(this).find('input[type="password"]').hide().prop('type', 'private'); 
    // }); 
}); 
0

在Mac Safari中,不会将autocomplete =“off”视为标记。它会查找电子邮件和密码的组合并自动填充它们。

由于我有两个领域相同的问题。

<input type="text" name="email" id="email" value="" placeholder="Enter Email"> 
<input type="password" name="password" id="password" value="" placeholder="Enter Password"> 

由于safari在这种情况下查找文本和密码的组合,以便自动填充保存在浏览器cookie中的值的字段。

你只需要做两件事。

<input type="password" name="email" id="email" value="" placeholder="Enter Email" onfocus="this.type='text'"> 
  1. 更改电子邮件字段中键入密码,而不是文本时加载窗体或页面加载。
  2. 对于onfocus事件与JavaScript更改类型为字段是需要的文本。

这只是一个hack.If任何人有更好的解决方案,请发布。