【问题标题】:.focus() Not Focusing On New Element.focus() 不关注新元素
【发布时间】:2013-05-13 21:30:25
【问题描述】:

我有一个重命名某些 div 的功能。我试图让它工作的方式是这样的:

  • 用户右键点击div
  • 用户点击上下文菜单上的“重命名”
  • Div 获取输入元素并自动聚焦
  • 按回车键或点击屏幕后输入被提交

我已完成大部分步骤,但单击“重命名”后输入元素没有被聚焦。代码如下:

function Rename( ){
    ClickedFile.innerHTML = "<input class='Rename' type='text' value='" + ClickedFile.innerHTML + "'>";
    ClickedFile.childNodes[0].focus();
}

ClickedFile 是被右键单击的节点。更改 innerHTML 工作正常,但 .focus() 没有,我不知道为什么。我在控制台上也没有收到任何错误。

我也尝试过使用:

ClickedFile.childNodes[0].select();
ClickedFile.childNodes[1].focus();
ClickedFile.focus();

他们都没有工作。

编辑:

  • 我知道使用 JQuery 可能会有所帮助,但我更想知道为什么这不起作用。

  • 我解决了这个问题。它与事件处理程序有关。我的答案贴在下面。

【问题讨论】:

  • @tadman jQuery??这到底是为了什么?这就像说 为什么你不首先使用 CodeIgniter。很难出错。
  • 你所拥有的似乎对我很有效here
  • 我没有使用它,以便更好地了解纯 JavaScript。我真的不想在这里争论我是否应该使用 jQuery
  • @tadman 阅读我的最后评论
  • 由于这是一个 JavaScript 问题,因此政策似乎是:Don't answer it telling the asker to use jQuery. 只需使用 JavaScript 回答,除非明确要求使用 jQuery 或其他框架,或将其命名为正在使用。

标签: javascript html


【解决方案1】:

您必须将元素添加为 DOM 的一部分

var input = document.createElement("input");
input.className = "Rename";
input.type = "text";

document.getElementById("somenode").appendChild(input);
input.focus(); // should work now

the fiddle

【讨论】:

  • 我不知道为什么,但它仍然不起作用,如果我不能让它工作,我可能会发布更多代码
  • @TaylorFlores 检查我更新的答案中的小提琴。为我工作。
  • 是的,它可以工作,但我在我的页面上使用它时遇到了问题。我很快就会发布一个小提琴
  • @TaylorFlores 所以...小提琴在哪里?
  • 我正在努力。抱歉,我得去学校接我弟弟
【解决方案2】:

原因是因为您会立即调用 select 和 focus 方法。浏览器还没有机会插入该元素,因此它不是 DOM 的一部分。

一个快速而肮脏的解决方案是使用值为 0 毫秒的setTimeout-函数:

function Rename( ){
    ClickedFile.innerHTML = "<input class='Rename' type='text' value='" + ClickedFile.innerHTML + "'>";
    setTimeout(function(){ClickedFile.childNodes[0].focus();}, 0);
}

这会导致浏览器完成它必须做的所有事情,然后运行你传递给setTimeout的函数

以下小提琴显示您的示例处于工作状态:http://jsfiddle.net/Kennethtruyers/fX8h6/

【讨论】:

  • 哦,对不起,我没有提到我在类似问题中看到的也尝试过。没有太大帮助
  • 在你这样做之前,innerHTML 的价值是什么?你确定它没有破坏你的 textnox 吗?
  • 之前的innerHTML只是一个文件名(即
    testFile.c
  • 我认为你最好的办法是创建一个 jsfiddle,所以我们可以尝试一些事情
  • 我刚刚尝试了一些东西,您的原始代码似乎在 Chrome 中运行良好。你用的是什么浏览器?
【解决方案3】:

我通过更改重命名要在“mouseup”而不是“mousedown”上触发的 div 的函数来解决问题。

我认为这是导致问题的原因是因为在 mousedown 时触发了 Rename() 函数,导致在“mousedown”期间设置焦点,但直到“mouseup”才隐藏上下文菜单。

我无法确认这就是原因,但我知道代码在“mousedown”更改为“mouseup”以触发 Rename() 后有效。

【讨论】:

  • 我感觉有点不好,因为没有人能回答这个问题是因为我没有发布整个代码。很抱歉!
  • 感谢您花时间发布您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多