Vaadin 如何设置自动完成=";关「;在瓦丁

Vaadin 如何设置自动完成=";关「;在瓦丁,vaadin,Vaadin,是否可以在Vaadin 7中的文本字段上设置HTML5属性autocomplete=“off”? 我已经搜索过了,但没有找到在文本字段上设置属性的方法,也没有找到在vaadin中以其他方式提示浏览器禁用输入字段的本机自动补全功能的方法。我认为使用javascript的唯一方法是: TextField tf = new TextField(); tf.addStyleName("xyz"); JavaScript.getCurrent().execute( "document.getEle

是否可以在
Vaadin 7
中的文本字段上设置HTML5属性
autocomplete=“off”

我已经搜索过了,但没有找到在文本字段上设置属性的方法,也没有找到在vaadin中以其他方式提示浏览器禁用输入字段的本机自动补全功能的方法。

我认为使用javascript的唯一方法是:

TextField tf = new TextField();
tf.addStyleName("xyz");
JavaScript.getCurrent().execute(
    "document.getElementsByClassName('xyz')[0].setAttribute('autocomplete', 'off')");

扩展文本字段

package com.example;
import com.vaadin.ui.TextField;

public class MyTextField extends TextField {
   // do other customization here  as needed
}
…还有-这里的关键点是什么-它的客户端连接器

package com.example.client;

import com.vaadin.client.ui.VTextField;
import com.vaadin.client.ui.textfield.TextFieldConnector;
import com.vaadin.shared.ui.Connect;

@Connect(com.example.MyTextField.class)
public class MyTextFieldConnector extends TextFieldConnector {

   @Override
   public VTextField getWidget() {
      VTextField vTextField = super.getWidget();
      vTextField.getElement().setAttribute("autocomplete","off");
      return vTextField;
   }

}
不要忘记重新编译小部件集。

如果使用,现在可以使用HtmlementPropertySetter类包装TextField组件,并使用该类将“autocomplete”元素属性设置为“off”。您也可以使用Viritin附带的MTextField组件,只需按如下方式创建它:

MTextField username = new MTextField("Username")
        .withAutocompleteOff();

这是@Wojciech Marciniak答案的扩展。他的方法对我来说很有效,但我想指出,为了使其在2017/11/28起生效,我必须做两三次修改

1)
autocomplete=“off”
如今似乎不再有效;至少不是在铬上。相反,您可以使用在Chrome 62.0.3202.94 windows 64位上运行的
autocomplete=“new password”
。我还注意到该属性存在一些不一致的行为,因为这些行为并不总是有效的——有时组件上会显示一个包含密码选项的列表(特别是在您刷新几次之后,等等)

2a)您可能不想扩展组件,而是想通过在项目中创建
com.vaadin.client.ui.(组件)字段
包来覆盖它,然后将修改后的
(组件)FieldConnector.java
文件放入其中(在我的例子中,我正在修改
密码字段
)以防您希望此组件的所有实例都不记住密码。最后一个类源应该如下所示:

package com.vaadin.client.ui.passwordfield;

import com.vaadin.client.ui.VPasswordField;
import com.vaadin.client.ui.textfield.TextFieldConnector;
import com.vaadin.shared.ui.Connect;
import com.vaadin.ui.PasswordField;

@Connect(PasswordField.class)
public class PasswordFieldConnector extends TextFieldConnector {

    @Override
    public VPasswordField getWidget() {
        VPasswordField vTextField = (VPasswordField) super.getWidget();
        vTextField.getElement().setAttribute("autocomplete","new-password");
        return vTextField;
    }
}
这样,您就不需要任何其他类来扩展TextField(或PasswordField)


2b)如果您希望允许某些字段记住密码,而其他字段不记住密码,则可以扩展该组件并相应地使用首选组件。您可以像2a)中那样保留连接器类,但请记住将其命名为类似于
CustomPasswordFieldConnector
,并且它还应该
@Connect
与该CustomPasswordField.class连接,将该类放在项目中的任何位置,并记住在连接器中添加适当的
import
,以防需要。这个类只是一个虚拟类-如果不需要任何额外的功能,可以将其内容留空(但请记住,它应该扩展适当的
(组件)字段
密码字段

我不再处理Vaadin项目来确认它是否有效。如果有第三方确认,我会将这个答案设置为可接受的,因为这是我在Java中的首选方式,而不是使用JavaScriptHi Krayo,我刚刚添加了这个,它可以工作,但当我刷新页面时,它会关闭,有什么解决方案吗?