我有2种基本形式-登录和注册,都在同一页面上。现在,我可以自动填写表单登录了,但是注册表单也会自动填写,我不喜欢它。
另外,表单样式的背景为黄色,我无法覆盖它,也不想使用内联CSS来实现。我该怎么办才能使它们停止变为黄色和(可能)自动填充?提前致谢!
我有2种基本形式-登录和注册,都在同一页面上。现在,我可以自动填写表单登录了,但是注册表单也会自动填写,我不喜欢它。
另外,表单样式的背景为黄色,我无法覆盖它,也不想使用内联CSS来实现。我该怎么办才能使它们停止变为黄色和(可能)自动填充?提前致谢!
Answers:
对于自动完成,您可以使用:
<form autocomplete="off">
关于着色问题:
从屏幕截图中,我可以看到该webkit生成以下样式:
input:-webkit-autofill {
background-color: #FAFFBD !important;
}
1)由于#id样式比.class样式更为重要,因此可以使用以下方法:
#inputId:-webkit-autofill {
background-color: white !important;
}
2)如果不起作用,您可以尝试通过javascript以编程方式设置样式
$("input[type='text']").bind('focus', function() {
$(this).css('background-color', 'white');
});
3)如果那行不通,那就注定了:-):这不会隐藏黄色,但是会使文本再次可读。
input:-webkit-autofill {
color: #2a2a2a !important;
}
4)CSS / JavaScript解决方案:
CSS:
input:focus {
background-position: 0 0;
}
并且以下javascript必须在加载时运行:
function loadPage()
{
if (document.login)//if the form login exists, focus:
{
document.login.name.focus();//the username input
document.login.pass.focus();//the password input
document.login.login.focus();//the login button (submitbutton)
}
}
例如:
<body onload="loadPage();">
祝好运 :-)
5)如果上述任何一项均未尝试删除输入元素,将其克隆,然后将克隆的元素放回到页面上(在Safari 6.0.3上可用):
<script>
function loadPage(){
var e = document.getElementById('id_email');
var ep = e.parentNode;
ep.removeChild(e);
var e2 = e.cloneNode();
ep.appendChild(e2);
var p = document.getElementById('id_password');
var pp = p.parentNode;
pp.removeChild(p);
var p2 = p.cloneNode();
pp.appendChild(p2);
}
document.body.onload = loadPage;
</script>
6)从这里:
if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {
$(window).load(function(){
$('input:-webkit-autofill').each(function(){
var text = $(this).val();
var name = $(this).attr('name');
$(this).after(this.outerHTML).remove();
$('input[name=' + name + ']').val(text);
});
});
}
code
var keepTheInputCloned = setInterval(function(){ var e = document.getElementById('id_email'); var ep = e.parentNode; ep.removeChild(e); var e2 = e.cloneNode(); ep.appendChild(e2); var p = document.getElementById('id_password'); var pp = p.parentNode; pp.removeChild(p); var p2 = p.cloneNode(); pp.appendChild(p2); },50); setTimeout(function(){clearInterval(keepTheInputCloned)},1000);
使用“强烈”的内部阴影来欺骗它:
input:-webkit-autofill {
-webkit-box-shadow:0 0 0 50px white inset; /* Change the color to your own background color */
-webkit-text-fill-color: #333;
}
input:-webkit-autofill:focus {
-webkit-box-shadow: 0 0 0 50px white inset;/*your box-shadow*/
-webkit-text-fill-color: #333;
}
添加此CSS规则,黄色背景颜色将消失。:)
input:-webkit-autofill {
-webkit-box-shadow: 0 0 0px 1000px white inset;
}
<form autocomplete="off">
几乎所有现代浏览器都会尊重这一点。
autocomplete
是,它5版之前是无效的HTML
经过2个小时的搜索,看来Google Chrome浏览器仍然可以覆盖黄色,但是我找到了解决方法。它也将适用于悬停,聚焦等。您所要做的就是添加!important
它。
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0px 1000px white inset !important;
}
这将完全消除输入字段中的黄色
有时,仅在<form>
元素中包含代码时,浏览器上的自动完成功能仍然会自动完成。
我也尝试将其放在<input>
元素中,并且效果更好。
<form autocomplete="off"> AND <input autocomplete="off">
但是,对该属性的支持正在停止,请阅读 https://bugzilla.mozilla.org/show_bug.cgi?id=956906#c1
https://bugzilla.mozilla.org/show_bug.cgi?id=956906
我发现的另一种解决方法是在输入字段中删除占位符,以表明该字段是电子邮件,用户名或电话字段(即“您的电子邮件”,“电子邮件”等)。)
这样一来,浏览器就不会知道它是哪种字段,因此不会尝试自动完成该字段。
如果它在输入字段中,您正在尝试“取消黄色” ...
因此,它可能看起来像这样:
<input id="login" style="background-color: #ccc;" value="username"
onblur="if(this.value=='') this.value='username';"
onfocus="if(this.value=='username') this.value='';" />
这可以解决Safari和Chrome上的问题
if(navigator.userAgent.toLowerCase().indexOf("chrome") >= 0 || navigator.userAgent.toLowerCase().indexOf("safari") >= 0){
window.setInterval(function(){
$('input:-webkit-autofill').each(function(){
var clone = $(this).clone(true, true);
$(this).after(clone).remove();
});
}, 20);
}
该form
元素有一个autocomplete
可以设置为属性off
。从CSS开始,!important
属性后的指令可防止其被覆盖:
background-color: white !important;
只有IE6无法理解。
如果我误解了您,那么您还会outline
发现有用的财产。
!important
指令,在这种情况下,它优先于其他所有指令。您应该查看用户代理样式表(尽管我不知道在哪里找到它)。
我已经看到Google工具栏的自动完成功能已被javascript禁用。它可以与其他一些自动填充工具一起使用。我不知道这对内置自动完成功能的浏览器是否有帮助。
<script type="text/javascript"><!--
if(window.attachEvent)
window.attachEvent("onload",setListeners);
function setListeners(){
inputList = document.getElementsByTagName("INPUT");
for(i=0;i<inputList.length;i++){
inputList[i].attachEvent("onpropertychange",restoreStyles);
inputList[i].style.backgroundColor = "";
}
selectList = document.getElementsByTagName("SELECT");
for(i=0;i<selectList.length;i++){
selectList[i].attachEvent("onpropertychange",restoreStyles);
selectList[i].style.backgroundColor = "";
}
}
function restoreStyles(){
if(event.srcElement.style.backgroundColor != "")
event.srcElement.style.backgroundColor = "";
}//-->
</script>
在尝试了很多事情之后,我发现了可以解决自动填充字段并替换为重复字段的有效解决方案。为了避免发生附带的事件,我想出了另一个(有点冗长)的解决方案。
在每个“输入”事件处,它将“更改”事件迅速附加到所有涉及的输入上。它会测试它们是否已自动填充。如果是,则调度一个新的文本事件,该事件将诱使浏览器认为该值已由用户更改,从而允许删除黄色背景。
var initialFocusedElement = null
, $inputs = $('input[type="text"]');
var removeAutofillStyle = function() {
if($(this).is(':-webkit-autofill')) {
var val = this.value;
// Remove change event, we won't need it until next "input" event.
$(this).off('change');
// Dispatch a text event on the input field to trick the browser
this.focus();
event = document.createEvent('TextEvent');
event.initTextEvent('textInput', true, true, window, '*');
this.dispatchEvent(event);
// Now the value has an asterisk appended, so restore it to the original
this.value = val;
// Always turn focus back to the element that received
// input that caused autofill
initialFocusedElement.focus();
}
};
var onChange = function() {
// Testing if element has been autofilled doesn't
// work directly on change event.
var self = this;
setTimeout(function() {
removeAutofillStyle.call(self);
}, 1);
};
$inputs.on('input', function() {
if(this === document.activeElement) {
initialFocusedElement = this;
// Autofilling will cause "change" event to be
// fired, so look for it
$inputs.on('change', onChange);
}
});
我读了很多线程,尝试了很多代码。收集完所有内容后,我发现彻底清空登录名和密码字段并将其背景重置为白色的唯一方法是:
$(window).load(function() {
setTimeout(function() {
$('input:-webkit-autofill')
.val('')
.css('-webkit-box-shadow', '0 0 0px 1000px white inset')
.attr('readonly', true)
.removeAttr('readonly')
;
}, 50);
});
随时发表评论,如果您发现了一些增强功能,我将对其开放。
现代浏览器不支持自动完成关闭功能。我发现解决自动完成问题的最简单方法是使用HTML和JS进行一些学习。要做的第一件事是将HTML中的输入类型从“密码”更改为“文本”。
<input class="input input-xxl input-watery" type="text" name="password"/>
窗口加载后,自动完成功能开始。没关系。但是,当您的字段类型不是“密码”时,浏览器将不知道必须填写哪些字段。因此,表单字段上不会自动完成。
之后,将事件focusin绑定到密码字段,例如。在骨干网中:
'focusin input[name=password]': 'onInputPasswordFocusIn',
在中onInputPasswordFocusIn
,只需通过简单的检查将字段的类型更改为密码即可:
if (e.currentTarget.value === '') {
$(e.currentTarget).attr('type', 'password');
}
就是这样!
UPD:此功能不适用于禁用的JavaSciprt
UPD在2018年。还发现了一些有趣的把戏。将readonly属性设置为输入字段,并在焦点事件上将其删除。首先阻止浏览器自动填充字段,其次允许输入数据。
autocomplete=off
,因为它可以在FF,Chrome浏览器中使用一段时间,以及从IE以前版本开始的版本
请尝试在输入标签中使用autocomplete =“ none”
这对我有用
我还必须将文本颜色更改为较暗的颜色(请参见StackOverflow深色主题颜色)。
因此最终得到了@TamásPap,@ MCBL和@don的解决方案的混合体:
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0px 1000px #2d2d2d inset !important;
-webkit-text-stroke-color: #e7e8eb !important;
-webkit-text-fill-color: #e7e8eb !important;
}
为什么不将其放在您的CSS中:
input --webkit-autocomplete {
color: inherit;
background: inherit;
border: inherit;
}
那应该解决您的问题。尽管它确实引起了可用性问题,因为现在用户无法看到表单是按照他/她惯用的方式自动填充的。
[edit]发布此内容后,我看到已经给出了类似的答案,并且您对此发表了评论,认为它不起作用。我不太清楚为什么,因为当我测试它时它确实起作用了。
input:-webkit-autofill
而且input --webkit-autocomplete
根本就不存在
真正的问题是Webkit(Safari,Chrome等)存在错误。当页面上有多个[表单]时,每个表单都有[input type =“ text” name =“ foo” ...](即属性'name'的值相同),则当用户返回时到页面时,自动填充将在页面上第一个[表单]的输入字段中完成,而不是在发送的[表单]中完成。第二次,将自动填充NEXT [form],依此类推。只有具有相同名称的输入文本字段的[form]才会受到影响。
这应该报告给Webkit开发人员。
Opera自动填充正确的[form]。
Firefox和IE不会自动填充。
因此,我再说一遍:这是Webkit中的错误。