【问题标题】:Test if two first chars typed in are alphanumeric - no regex测试输入的两个第一个字符是否是字母数字 - 没有正则表达式
【发布时间】:2011-06-06 16:22:35
【问题描述】:

我有以下代码需要智能处理输入字符和检测:

private final MultiWordSuggestOracle mySuggestions = new MultiWordSuggestOracle();
private final Set<String> mySuggestionsData = new HashSet<String>();

@UiHandler("suggestBox")
public void onKeyPress(KeyDownEvent event) {
    if (Character.isLetterOrDigit(event.getCharCode())) {
        char[] text = suggestBox.getText().trim().toCharArray();
        if (text.length != 1) return;

        for (char ch : text) {
            if (!Character.isLetterOrDigit(ch)) {
                return;
            }
        }
        //load data from server into mySuggestionsData
    }     
}

问题分为三个部分:

  1. 如何针对字母数字字符测试按下的键。请记住,这是 GWT,所以我宁愿不使用正则表达式(但如果没有其他选项......)。

  2. 检测输入到 SuggestBox 中的文本长度的最佳方法是什么?

  3. KeyDownEven 是最佳选择吗?为什么按下任何键都会触发两次?

【问题讨论】:

    标签: java gwt detect alphanumeric chars


    【解决方案1】:

    您应该创建自己的SuggestOracle,而不是处理事件(可能包装MultiSuggestOracle 用作内部缓存)并检查查询 的长度和“模式”以决定是否调用服务器(然后给出一个空的建议列表作为响应,或者一个建议是确切的查询)。

    附带说明,我不明白您为什么不想使用正则表达式;使用将正则表达式作为Stringjava.lang.String 方法或com.google.gwt.regexp.shared.RegExp 类。

    【讨论】:

    • 代码中的某处:static final RegExp AT_LEAST_TWO_ALPHANUMS = RegExp.compile("^[a-zA-Z0-9]{2,}$"); 然后当您需要检查它是否匹配时:if (AT_LEAST_TWO_ALPHANUMS.test(request.getQuery())) ...
    【解决方案2】:

    1. 我会使用 KeyPressHandler 而不是 Up/Down 处理程序。

    据我了解,您更感兴趣的是获取用户键入的内容,而不是实际在键盘上按下的键。此外,您可以使用 Character.isDigit(c)Character.isLetter(c) 因为 KeyPressEvent.getCharCode() 将返回 char (c).

    2.您可能想在某个时候检查文本长度(例如,当用户按下 Enter 时),然后

    // handler block
    if (c == KeyCodes.KEY_ENTER) {
        int length = ((SuggestBox) event.getSource()).getText().length();
        // take an action depending on length
    }
    // handler block continued
    

    应该合适。

    3.参见 [1],也许它是特定于浏览器的。

    编辑: [1]、[2] 和 [3] 组合(使用 KeyUpHandler):

    private static final int THREASHOLD = 2;
    private String phrase = "";
    ...
        searchBox.addKeyUpHandler(new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                String text = ((SuggestBox) event.getSource()).getText();
                if (!phrase.equals(text)) {
                    if (text.length() >= THREASHOLD) {
                        boolean alphanum = true;
                        for (int i = 0; i < THREASHOLD; i++) {
                            char c = text.charAt(i);
                            if (!Character.isDigit(c) && !Character.isLetter(c)) {
                                alphanum = false;
                                break;
                            }
                        }
                        if (alphanum) {
                            //RPC (won't be called twice)
                        }
                    }
                    phrase = text;
                }
            }
        });
    

    【讨论】:

    • @Mat Banik:呃,我完全错过了标题。那么是的,我不知道除了附加 KeyUp 处理程序之外的其他方法;将在一分钟内更新答案..
    • @Mat Banik: As far as browser specific GWT takes care of that - 我不太确定(尤其是关于按键/按键事件处理);希望更新对你有一些价值。
    • @Mat Banik:这看起来像你的情况:code.google.com/p/google-web-toolkit/issues/detail?id=3533(另外,已知某些平台上的某些浏览器会触发两次 keyUp/Down 事件)
    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多