【问题标题】:Click and keypress combined点击和按键组合
【发布时间】:2017-07-27 01:07:17
【问题描述】:

大家好,我正在尝试在我的功能上组合点击和按键,但到目前为止我尝试过的任何方法似乎都不起作用。 这是我的代码:

function victoryMessage() {

    $(document).off("keyup", handleKeyUp);
    $('#feedback').append("Bravo!<br><br><div id='replay' class='button'>Nastavi</div>");


    $('#replay').on("click",function () {
        if(questionBank.length>3) {
            gameScreen();
        }
        else {
            finalPage();
        }
    });

    $(document).off("tap", keepFocus).trigger("tap");
}

到目前为止,我已经尝试过以下操作:

$("#replay").on("click keyup", function (e) {
    if (e.type == "click" || e.keyCode == 13) {
        if(questionBank.length>0) {
            gameScreen();
        }
        else {
            finalPage();
        }
    }
});

var callback = function() {
    if(questionBank.length>0) {
        gameScreen();
    }
    else {
        finalPage();
    }   
};

$("#replay").keypress(function() {
    if (event.which == 13) callback();
});

$('#replay').click(callback);

$(document).on("keypress", function(e){
    if (e.which == 13) {
        testKey();
    }
});

我也尝试了其他一些方法,但似乎没有任何效果。在这里你可以看到我的完整代码http://www.wpacademy.nextweb.space/TestingMobile/
编辑:澄清安迪所说,我希望仅在单击重播按钮时单击进行注册,并在文档中的任何位置按下回车键时进行注册。

【问题讨论】:

    标签: javascript jquery html css keyboard


    【解决方案1】:

    根据我的测试,您无法直接按下按钮,因此可能的解决方案如下

    当用户在屏幕上的任意位置按 Enter 键时,将 alert 替换为您的函数调用。

    $(document).keypress(function(e) {
        if(e.which == 13) {
            alert('You pressed enter!');
        }
    });
    
    $("#replay").on("click", function(){
      function call
    });
    

    此外,为了避免您的代码一直在按键事件中运行,您可以检查屏幕上是否存在特定元素,例如重播按钮。

    希望有帮助

    【讨论】:

    • 谢谢,这就是我想要的。同样对于您答案的第二部分,我是否应该使用类似的方法来实现它> if ($('#MyId').length) { // My Code }
    • @Zvezdas1989 是的,类似于您提供的代码,或者通过检查元素是否具有类或对页面可见。
    【解决方案2】:

    我想这就是你所追求的。您希望仅在单击重播按钮时进行单击注册,并在文档中的任意位置按下回车键时进行注册。

    $(document).on("click keypress", function (e) {      
      if (e.type === "click" && e.target && e.target.id === "replay") {
        e.preventDefault();  
        $("#output span").html("click happened");
      } else if (e.type === "keypress" && e.keyCode === 13) {   
        e.preventDefault();  
        $("#output span").html("enter key anywhere within document happened");
      }
    });
    #output {
      margin-top: 1em;
      padding: 0.5em 0.5em 0;
      border: 2px dashed gray;
      width: 300px;
      display: block;
      height: 50px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <button id="replay">replay button</button>
    <div id="output">Event type: <span></span></div>

    【讨论】:

    • 你的代码也很好用,我很感谢你,但是作为一个比较新开始学习 JS 的人,Petros 代码对我来说更容易理解,所以我选择了他的解决方案。我当然赞成你:)
    【解决方案3】:

    由于元素是通过 JS 创建的,因此将点击处理程序分配给 document 并将其推迟到 #replay。而且我不确定你打算如何在div 上捕获keyup,但如果你在div 上设置contenteditable,你可以双击文本,然后输入它以显示这两个事件是被俘虏。这是一个代码笔http://codepen.io/anon/pen/RpGEWK

    $('#feedback').append("Bravo!<br><br><div id='replay' class='button' contenteditable>Nastavi</div>");
    $(document).on("click keyup", "#replay", function(e) {
      console.log(e);
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="feedback"></div>

    【讨论】:

    • 您在这里是说对文档的所有点击都将转到#replay 按钮,但我不确定在这种情况下是否有意义。
    • @PetrosKyriakou 感谢您的评论。我建议阅读api.jquery.com/on "的底部。请注意,.on() 允许在任何段落上单击事件——甚至是新段落——因为该事件在冒泡后由始终存在的 body 元素处理那里。” - 他们使用$('body').on('click','p',function() {});document 而不是body 同样常见。
    • @PetrosKyriakou “对文档的所有点击都将转到#replay 按钮” 为假。只有单击文档中的#replay 才会通过此事件处理程序。您应该阅读 API - 这是用于新/渲染元素的标准 jQuery。
    • 是的,完全正确忽略我的评论,不知道为什么我在那里感到困惑,即使我在自己的项目中也使用了延迟调用。
    • @PetrosKyriakou 我第一次看到它时让我很困惑 :) 你对我的回答投了反对票吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2012-03-08
    • 2018-07-24
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多