仅当光标在输入字段中时才禁用输入键回发

时间:2018-04-09 22:03:02

标签: javascript asp.net vb.net dialogflow

我正在使用一个用户控件来显示Dialogflow的聊天框,我想让enter将框中输入的字符串提交给JavaScript事件而不是后面的代码。我希望能够将此用户控件添加到我的任何.net页面,其中包含自己的按钮和输入。不幸的是,这个要求阻止我采取简单的路线并禁用表格中的回车键提交行为。

以下是控件的HTML:

<div id="mainWrapper">
    <div id="result">

    </div>
    <div id="inputField">
        <input placeholder="Ask me a question" id="query" type="text" />
    </div>
    <asp:HiddenField ID="access" runat="server" />
</div>

我目前唯一能做的代码就是在页面加载时为该隐藏字段赋值。我已尝试将输入更改为asp:TextBox,并添加UseSubmitBehavior="False",但仍会导致回发。我还在我正在使用的JavaScript中添加了return false;,但似乎回发在它运行之前发生。

以下是相关的JavaScript:

(function () {
    "use strict";
    var token, queryInput, resultDiv;
    var ENTER_KEY_PRESS = 13;
    var client;
    window.onload = init;

    function init() {
        token = document.getElementByID("<%= access.ClientID %>").value;
        queryInput = document.getElementById("query");
        resultDiv = document.getElementById("result");

        queryInput.addEventListener("keydown", keyDown);
    }

    function keyDown(event) {
        if (event.which === ENTER_KEY_PRESS) {
            console.log("Enter pressed")
            var queryValue = queryInput.value;
            queryInput.value = "";

            sendTextToDIalogflow(value)
                .then(function (response) {
                    var result;
                    try {
                        result = response.result.fulfillment.speech;
                    } catch (error) {
                        result = "error: " + error.message;
                    }
                    console.log(result)
                })
                .catch(function (err) {
                    console.log("Whoops, something went wrong: " + err.message);
                });
        }
        else {
            console.log("Enter not pressed")
        }
    }
    return false;
})();

如果光标位于文本框中而不对页面上的其他asp.net控件执行相同的操作,如何阻止enter键触发回发?

1 个答案:

答案 0 :(得分:1)

这可能不是唯一的,我注意到你没有按照你的模式找到元素ID:

queryInput = document.getElementById("<%= query.ClientID %>");
resultDiv = document.getElementById("<%= result.ClientID %>");

在按键上,你需要防止输入传播。所以这是一个彻底改变:

function keyDown(event) {
    if (event.which === ENTER_KEY_PRESS) {
        console.log("Enter pressed")
        var queryValue = queryInput.value;
        queryInput.value = "";

        sendTextToDIalogflow(value)
            .then(function (response) {
                var result;
                try {
                    result = response.result.fulfillment.speech;
                } catch (error) {
                    result = "error: " + error.message;
                }
                console.log(result)
            })
            .catch(function (err) {
                console.log("Whoops, something went wrong: " + err.message);
            });

         // ADDED CODE
         // REFERENCE - https://stackoverflow.com/questions/1639338/why-does-returning-false-in-they-keydown-callback-does-not-stop-the-button-click
         if (event.preventDefault) {
             event.preventDefault();
         } else {
             event.returnValue = false;
         }
         // END ADDED CODE
    }
    else {
        console.log("Enter not pressed")
    }
}
相关问题