gpt4 book ai didi

javascript - 如何检测 div 何时失去焦点?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:46:35 26 4
gpt4 key购买 nike

给定以下标记,我想检测编辑器何时失去焦点:

<div class="editor">
<input type="text"/>
<input type="text"/>
</div>
<div class="editor">
<input type="text"/>
<input type="text"/>
</div>
<button>GO</button>

编辑:当用户在输入元素中切换时,当每个编辑器 div 失去焦点(意味着他们在 div 之外切换)时,将加载类添加到失去焦点的 div。

这段 jquery 是我期望的,但它什么也没做:

$(".editor")
.blur(function(){
$(this).addClass("loading");
});

这似乎可行,直到您添加控制台日志并意识到它会在输入的每个 focusout 上触发。

$('div.editor input').focus( function() {
$(this).parent()
.addClass("focused")
.focusout(function() {
console.log('focusout');
$(this).removeClass("focused")
.addClass("loading");
});
});

Here is a jsfiddle我一直在研究的测试用例。我知道我在这里遗漏了一些基本的东西。有哪位大侠能赐教吗?

编辑:在下面的一些评论之后,我几乎按照我想要的方式工作了。现在的问题是检测焦点何时更改到编辑器 div 之外的某个地方。这是我当前的实现:

function loadData() {
console.log('loading data for editor ' + $(this).attr('id'));
var $editor = $(this).removeClass('loaded')
.addClass('loading');

$.post('/echo/json/', {
delay: 2
})
.done(function () {
$editor.removeClass('loading')
.addClass('loaded');
});
}

$('div.editor input').on('focusin', function () {
console.log('focus changed');
$editor = $(this).closest('.editor');
console.log('current editor is ' + $editor.attr('id'));
if (!$editor.hasClass('focused')) {
console.log('switched editors');

$('.editor.focused')
.removeClass('focused')
.each(loadData);

$editor.addClass('focused');
}
})

有点复杂,并且使用类作为状态。我还添加了下一点复杂性,即在编辑器失去焦点时进行异步调用。 Here a my jsfiddle我目前的工作。

最佳答案

如果您希望将成对输入 的进入和退出视为将它们合并到一个控件中,您需要查看获得焦点的元素是否是在同一个 editor 中。您可以使用 0 的 setTimeout 将检查延迟一个周期(等待所有当前任务完成)。

$('div.editor input').focusout(function () {
var $editor = $(this).closest('.editor');
// wait for the new element to be focused
setTimeout(function () {
// See if the new focused element is in the editor
if ($.contains($editor[0], document.activeElement)) {
$editor.addClass("focused").removeClass("loading");
}
else
{
$editor.removeClass("focused").addClass("loading");
}
}, 1);
});

JSFiddle:http://jsfiddle.net/TrueBlueAussie/8s8ayv52/18/

要完成拼图(获得初始绿色状态),您还需要捕获 focusin 事件并查看它是否来自来自 同一编辑器(将先前的焦点元素保存在全局等中)。

旁注:我最近不得不编写一个 jQuery 插件来为元素组完成所有这些工作。它生成自定义 groupfocusgroupblur 事件,使其余代码更易于使用。

更新 1:http://jsfiddle.net/TrueBlueAussie/0y2dvxpf/4/

根据您的新示例,您可以多次捕获 focusin 而不会受到损坏,因此毕竟没有必要跟踪先前的焦点。使用我之前的 setTimeout 示例可以解决您在 div 外部单击时遇到的问题。

$('div.editor input').focusin(function(){
var $editor = $(this).closest('.editor');
$editor.addClass("focused").removeClass("loading");

}).focusout(function () {
var $editor = $(this).closest('.editor');
// wait for the new element to be focused
setTimeout(function () {
// See if the new focused element is in the editor
if (!$.contains($editor[0], document.activeElement)) {
$editor.removeClass("focused").each(loadData);
}
}, 0);
});

关于javascript - 如何检测 div 何时失去焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26303771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com