【问题标题】:Disable enter key postback only when cursor is in input field仅当光标在输入字段中时才禁用输入键回发
【发布时间】:2018-04-09 22:03:01
【问题描述】:

我正在开发一个用户控件以显示 Dialogflow 的聊天框,我想输入将框中输入的字符串提交给 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 控件执行相同操作?

【问题讨论】:

    标签: javascript asp.net vb.net dialogflow-es


    【解决方案1】:

    这可能不是唯一的事情,我注意到您在查找元素 ID 时没有遵循您的模式:

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

    并且在按键时,您需要防止输入传播。所以这是一个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);
                });
    
             // 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")
        }
    }
    

    【讨论】:

    • 我刚刚将您提供的代码添加到函数中,它似乎并没有停止回发。
    • 应该是事件。不是 e.,因为您使用 event 作为参数...我更新了它...id 还建议您的 init 函数转到底部
    • 我添加了一个关于概念的小提琴,所以你可以看到它在行动中......显然在我的小提琴中我无法使用 asp.net 客户端 ID 或自定义函数的东西 - jsfiddle.net/eYzSX/178跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2020-07-19
    • 1970-01-01
    • 2015-05-03
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多