这是我的初始问题的完整修订版,所有不必要的资源和参考资料都已删除
我将同一个事件监听器绑定到两个不同的元素:一个按钮和一个Enter键,它看起来如下所示:
var funcelement = function(){
//function code
};
$('#buttonID').click(funcelement);
$('#inputID').keyup(function () {
if (event.which == 13) {
$('#buttonID').trigger('click');
}
})
我想要做的是,如果使用preventDefault()将焦点放在提交按钮(#buttonID)上,则阻止传入按键传播。
所以我尝试了各种组合使它工作。以下是我尝试的最新结果
$('#inputID').keyup(function () {
var hasfocus = $('#buttonID').is(':focus') || false;
if (event.which == 13) {
if (!hasfocus) {
event.preventDefault();
$('#buttonID').trigger('click');
//hasfocus = true;
}
else {
//event.preventDefault();
//$('#buttonID').trigger('click');
}
}
})
在输入框中输入文本并按Enter键后,会弹出一个带有是/取消按钮的确认窗口,并将焦点放在是按钮上。一旦我再次按下Enter键,另一个确认已进行更改的窗口会弹出,并按下Ok按钮。一旦我再次按Enter键,我需要的一切都在制作中。
然而,有一个问题:在完成最后一步之后,我将回到 if(!hasfocus)行。
如何防止这种情况发生?一旦我需要的东西完成了 - 我不想再次进入那条线。
答案 0 :(得分:1)
您可以将参数传递给函数并停止传播,如下所示:
var funcelement = function(event, wasTriggeredByEnterKey){
if (wasTriggeredByEnterKey && $('#buttonID').is(':focus')) {
event.stopPropagation;
}
//function code
};
$('#buttonID').click(funcelement);
$('#inputID').keyup(function () {
if (event.which == 13) {
$('#buttonID').trigger('click', [true]);
}
}
)
<强>更新强>
为了回答您修改过的问题,您应该在处理警报时使用“keydown”事件而不是“keyup”。这是因为警报以“keydown”事件关闭,但是当您释放回车键时仍然会触发“keyup”事件。只需更改一个单词:
$('#inputID').keydown(function () {
var hasfocus = $('#buttonID').is(':focus') || false;
if (event.which == 13) {
if (!hasfocus) {
event.preventDefault();
$('#buttonID').trigger('click');
//hasfocus = true;
}
else {
//event.preventDefault();
//$('#buttonID').trigger('click');
}
}
})