0

我整天都在寻找一个可行的例子,但没有找到任何真正有效的东西。

我有一个简单的在线反馈表,我用 WebView 设置了它,可以在 Android 设备上工作,特别是 Nexus 7(它只会在我们酒店的这些设备上本地使用)。

问题是 html 反馈表单有不同的字段集,有些带有单选按钮,有些带有文本字段和文本区域。表单是通过邮寄发送的,我有一个在表单中调用的 jquery 验证脚本:

<form name="form" method="post" action="feedback_manager/fb_save.php" onsubmit="return validateForm()" >

一切正常,除了当用户填写文本字段时,软键盘中有一个明显的蓝色“开始”按钮,一旦他们完成输入,他们必须点击(或触摸),问题是它没有不要将它们带到下一个表单字段集,而是自动提交表单(或者在这种情况下首先运行我的验证脚本)。

KEYCODE_ENTER 按钮的默认操作不是应该将用户发送到下一个字段集而不是提交表单吗?

我将分享我的 html 表单和我的 webView 脚本,希望有人会发现我做错了什么:

<fieldset>
<legend>Food quality, taste &amp; presentation</legend>

    <input id="flavor4" name="flavor" value="excellent" type="radio" />
    <label for="flavor4"> Excellent</label><br>

    <input id="flavor3" name="flavor" value="good" type="radio" />
    <label for="flavor3"> Good</label><br>

    <input id="flavor2" name="flavor" value="average" type="radio" />
    <label for="flavor2"> Average</label><br>

    <input id="flavor1" name="flavor" value="bad" type="radio" />
    <label for="flavor1"> Needs improvement</label><br>

</fieldset>
<fieldset>
    <legend>Who was your waiter today?</legend>
    <input name="waiter" type="text">
</fieldset>

//then another fieldset with radio buttons and so on

会不会是我的文本输入不是一个接一个地立即与单选按钮和组合框混合在一起?

这是我的 onKeyDown 代码:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
    {
        mWebView.goBack();
        return true;
    }
    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
        // do nothing
        return false;
    }
    return true;
}

有趣的是,我的 KEYCODE_BACK 条件工作正常,但我希望 KEYCODE_ENTER 按钮不执行任何操作,只关闭软键盘或转到下一个字段但不提交表单。

我在这里看到了很多关于 SO 的答案,但他们似乎都没有在 Nexus7 上工作(还没有真正在其他设备上尝试过)。

综上所述,我所需要的只是让那个蓝色的“Go”按钮不做任何事情或转到下一个字段。

请帮忙。

**编辑**

今天早上我以全新的眼光看待这个问题,发现这个类似的帖子添加了一个 OnKeyListener 来检测密钥,然后返回 false。在 EditText 上输入键,按两次 onKey

mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.loadUrl("http://some.url");
    mWebView.setWebViewClient(new virtuoWebViewClient());

    mWebView.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    // do nothing
                    return false;
                }
            }
            return false;
        }
    });

但仍然没有,“开始”按钮仍然提交表单:(,我会继续尝试,如果有人能指出我不同的方向或分享新想法,我将不胜感激。谢谢。

4

2 回答 2

2

我花了很长时间寻找解决方案,但没有什么是完美的。这是我能找到的最佳解决方法,它将“返回”(提交)操作替换为“选项卡”操作,除非焦点位于文本区域或提交按钮上:

$("form").keydown(function(e){
    if (e.which != 13) return; // ENTER
    if (e.target.type == "textarea" || e.target.type == "button") return;
    if ($("input[type=submit]", this).length == 1) return; // autosubmit form

    var nextTabbable = null;
    var $tr = $(e.target).closest("tr, form");
    var narrowContext = $tr.length && e.target.tabIndex == undefined && !$tr.is("form");
    if (narrowContext) nextTabbable = getNextTabbable($tr.add($tr.next()), e.target);
    if (!nextTabbable) nextTabbable = getNextTabbable(this, e.target);

    if (nextTabbable) {
        if (nextTabbable.type == "text" && nextTabbable.value != "") nextTabbable.select();
            nextTabbable.focus();
        return false;
    }
});

function getNextTabbable(ctx, current) {
    var $t = $("input[tabindex!=-1]:visible, select[tabindex!=-1]:visible, textarea[tabindex!=-1]:visible", ctx).not(":disabled");
    var docIndex = {};
    $t.each(function(i,e){ docIndex[e] = i });
    $sorted = $t.sort(function(a,b){ return a.tabIndex==b.tabIndex ? docIndex[a]<docIndex[b] : a.tabIndex<b.tabIndex ? -1 : 1 });
    return $sorted.get($sorted.index(current)+1);
}
于 2013-08-13T15:25:09.677 回答
1

好的,我不得不让它慢慢沸腾,因为它有点令人沮丧,经过大量的试验和错误之后,WebView 本身似乎不允许我在没有 EditText 的情况下进行的行为。我真的不需要此应用程序的 EditText,我发现输入类型文本显示“开始”按钮,但 textareas 没有,他们用回车按钮替换它(不是蓝色的,不发送表单),它既便宜又粗糙,但符合目的,所以我基本上最终使用了参数 rows="1" 的 textareas,所以它看起来像一个输入类型的文本。

<textarea rows="1" name="waiter"></textarea>

隐藏“Go”、“Done”或“Enter”按钮的技术含量非常低的解决方案 XD。

于 2013-02-06T07:52:26.143 回答