我想检测元素的焦点事件,但仅当用户按Tab键启动时才会检测到它。例如:
<input type="text" id="foo" />
<input type="text" id="detect" />
如果用户专注于#foo
并按下 Tab ,我希望在#detect
聚焦后触发事件(或焦点事件中的条件为真)。相反,如果用户只是单击#detect
字段来聚焦它,我不希望事件触发(或者我希望焦点事件调用中的条件为假)。
我不想使用#foo
的keydown事件并检查Tab键是否被按下,因为我希望该方法独立于任何其他元素。
我查看了以下代码的控制台输出,但未注意到两种聚焦方法之间存在任何实际差异:
$('#detect').on('focus', function(e){
console.log(e);
});
(fiddle)
这是否可以以相对简单的方式完成?
答案 0 :(得分:42)
我知道您接受了答案,但您可以使用以下方法测试按下的按钮:
$('#detect').on('focus', function(e){
$(window).keyup(function (e) {
var code = (e.keyCode ? e.keyCode : e.which);
if (code == 9) {
alert('I was tabbed!');
}
});
});
编辑:更改听众:
$(window).keyup(function (e) {
var code = (e.keyCode ? e.keyCode : e.which);
if (code == 9 && $('#detect:focus').length) {
alert('I was tabbed!');
}
});
答案 1 :(得分:7)
更具响应性的解决方案是使用两个侦听器:
var mousedown = false;
$('#detect').on('mousedown', function () {
mousedown = true;
});
$('#detect').on('focusin', function () {
if(!mousedown) {
// logic
}
mousedown = false;
});
小提琴显示速度的差异:
答案 2 :(得分:1)
正如您所注意到的,事件对象本身并不区分访问方式。您可以做的是绑定mousedown
侦听器,该侦听器将在focus
之前触发,并设置一些时间戳标记,与focus
中的某个阈值进行比较处理程序。
答案 3 :(得分:0)
您可以通过此代码检查特定输入的焦点事件
$(window).on('keyup', function(event){
if(event.keyCode == '9'){
getFocused(event);
}
})
var focused = 0;
function getFocused(e){
var ida = $(':focus').eq(0).prop('id');
if(ida=='detect' && focused==0){
focused = 1;
console.log(e);
}
}
答案 4 :(得分:0)
<input type="text" id="foo" />
<input type="text" id="detect" />
<script>
$("#foo").on('keyup', function(){
document.getElementById("detect").value = "007";
alert("your tab active successfully");
});
</script>
答案 5 :(得分:0)
我使用以下内容:
(function() {
const tabHistory = [];
window.addEventListener('keyup', function (e) {
const code = e.keyCode || e.which;
const index = tabHistory.length === 0 ? 1 : tabHistory.length + 1;
if (code == 9) {
tabHistory.push({
element: e.target,
index
});
console.log(index, e.target, tabHistory);
}
});
})();
我建议跟踪关注的元素,这样可以确保用户能够按期望的方式切换。
希望有帮助!