将焦点重新应用于替换的 DOM 元素

Posted

技术标签:

【中文标题】将焦点重新应用于替换的 DOM 元素【英文标题】:Reapplying focus to a replaced DOM element 【发布时间】:2013-04-10 12:25:39 【问题描述】:

在我的应用程序中,许多 DOM 元素使用 jquery-ujs。这在大多数情况下都很好。

有时,我有一个表单元素在获得焦点时被替换。我希望能够为用户保持焦点。

我尝试了以下方法,但问题是 jquery 似乎将新节点视为完全一样,而不是它正在替换的节点的精确副本:

$(document).on('ajax:beforeSend',function()
    window.focussed = $("*:focus");
);
$(document).on('ajax:complete',function()
    window.focussed.focus();
);

理想情况下,我可以在不添加标记的情况下实现这一点。

【问题讨论】:

不知道您的 html 是什么,因此无法提供完整的解决方案,但是要删除的元素是否具有名称或其他可用于选择它的属性?您可以存储 选择器 并使用它重新查找带有$(selector).focus() 的元素。或者使用被替换元素的索引使用.eq() 重新找到它 如前所述,如果可以的话,我想将此功能与标记分离 与标记的耦合不会比已经存在的多。我只是想问是否有另一种方法来存储对焦点元素的引用,无论是通过 DOM 路径还是其他属性。如果您将 HTML 添加到问题中,我可能会提出更具体的建议 【参考方案1】:

如果元素被新节点替换,那么关注保存在 window.focussed 中的元素将不会做任何事情。如果他们有相同的 id,你可以这样做:

$(document).on('ajax:beforeSend',function()
    window.focusedId = $("*:focus").prop("id");
);
$(document).on('ajax:complete',function()
    $(window.focusedId).focus();
);

【讨论】:

我想知道是否有另一种方法可以从$("*:focus") 中存储的信息中推断出匹配,而不需要特定的属性。

以上是关于将焦点重新应用于替换的 DOM 元素的主要内容,如果未能解决你的问题,请参考以下文章

注入表单元素后重新加载DOM?

从 DOM 中删除违规元素时,无效的表单不会重新计算其有效性

Android:使用 SurfaceView 重新获得焦点

在不同的屏幕尺寸上重新排序 DOM 元素

安卓onKeyDown事件 重新获取焦点

GTKMM/C++ 窗口事件失去/重新获得焦点?