.focus()不关注新元素
.focus() Not Focusing On New Element
我有一个重命名某些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可能会有所帮助,但我更感兴趣的是找出为什么这不起作用
我修复了这个问题。它与事件处理程序有关。
你必须添加元素作为DOM的一部分
var input = document.createElement("input");
input.className = "Rename";
input.type = "text";
document.getElementById("somenode").appendChild(input);
input.focus(); // should work now
看小提琴
原因是由于您立即调用了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/
我通过改变重命名div以触发'mouseup'而不是'mousedown'的函数来修复这个问题。
我认为这导致问题的原因是因为Rename()函数在mousedown上被触发,导致焦点在'mousedown'期间被设置,但上下文菜单直到'mouseup'才被隐藏。
我无法确认这是原因,但我知道代码工作后'mousedown'被更改为'mouseup'为Rename()的触发器。
相关文章:
- 触摸移动时切换到新元素
- 将按钮添加到新元素中
- 如何在javascript上向数组的对象添加新元素
- 如果数组仍在执行,async.forEach()将运行我添加到数组中的新元素
- 剑道UI下载列表:如何动态添加新元素
- 在DIV中动态插入HTML并访问新元素
- 使一个新元素在某个时间出现
- 单击不适用于新元素
- 动态添加新元素并更改其内容
- 没有为Ajax添加的新元素注册Jquery事件
- css在新元素上的转换
- 如何在不创建新元素的情况下修改 DOM 元素的位置
- jquery添加新元素
- 如何在遍历表和添加新元素时获得tr的索引
- PNG修复新元素
- 将点击事件绑定到新元素&使得ID'是独一无二的
- 从HTML表单中获取计算得到的JavaScript数据,并将其作为新元素添加到相同的表单操作中以使用PHP保存
- jQuery没有为具有新id的新元素执行代码
- jQuery倒计时-应用于通过AJAX/PHP加载的新元素
- 在元素内部创建新元素