Javascript:联合焦点模糊
Javascript: Unitentional Focus Blur
在学习Javascript的过程中,我一直在尝试实现所见即所得的代码编辑器。我没有实现内容可编辑的div
或textarea
,而是借鉴了Ajax的ACE的书(更确切地说,有很多借鉴)。
我有一个侦听器div
,tabIndex
设置为0,用于处理所有输入事件。编辑器的所有组件,如文本区域、光标和排水沟,都是此侦听器的子级。自从实现了鼠标事件处理程序以来,我一直有一个问题,即焦点不在mousedown
事件上。显然,即使侦听器中发生了mousedown
事件,也会触发blur
事件。
在注释掉某些方法调用并试图查看问题的确切原因后,我注意到罪魁祸首是render
方法。现在,我在每次输入后都调用这个方法,所以焦点丢失是非常奇怪的,尤其是当我为mousedown
事件调用它时。在注释掉render
方法时,当存在mousedown
事件时,不会触发blur
事件。
进一步说,在注释掉我替换文本容器的innerHTML
的部分后,问题就消失了。同样,这是非常奇怪的,因为我在render
函数中的不同位置使用了replaceInnerHTML
函数,但问题似乎只出现在特别更新文本div
时。
这是replaceInnerHTML方法(我在这里发现了它):
function replaceInnerHTML(el, html) {
var newEl = el.cloneNode(false);
newEl.innerHTML = html;
el.parentNode.replaceChild(newEl, el);
return newEl;
}
这是文本层的更新功能,在省略时不会出现此问题:
TextLayer.prototype.update = function(config) {
html = [];
var top = config.topRow;
var last = config.lastRow;
for(var i=top; i<=last; i++) {
var line = this._session.getLine(i);
if(line) {
html.push('<div class="line" style="height:'+this.$characterSize.height+'px;">');
this.renderLine(html, line);
html.push('</div>');
}
}
this._text = replaceInnerHTML(this._text, html.join(''));
this.setSize(config.totalWidth, config.scrollHeight);
};
为什么焦点只会因为替换特定节点的innerHTML
而变得模糊,而只有在mousedown
事件的情况下调用它时才会变得模糊?
或者我在尝试调试这个问题时走错了方向,而这个问题是由其他原因引起的?
编辑:
多亏了pimvdb,这里有一个小提琴再现了这个问题。http://jsfiddle.net/wG4Yy/39/
blur
事件似乎是由于对mousedown
事件上的节点进行重组而引发的。我不知道如何解决这个问题。我尝试过使用文档片段而不是innerHTML,也尝试过使用setTimeout
来安排更新,但都没有成功。
我应该怎么做才能解决这个问题?
当你想要一个元素获得焦点时,似乎你必须点击一个停留在那里的元素。如果你用另一个元素替换它,浏览器显然不会被欺骗来聚焦该元素。
您可以让浏览器完成mousedown/focus等过程,然后手动聚焦元素。这可以通过setTimeout(..., 0)
调用来实现:http://jsfiddle.net/wG4Yy/41/.
setTimeout(function() {
wrapper.focus();
}, 0);
- 如果模糊事件的任何一个子项获得焦点,请阻止启动模糊事件
- Javascript:联合焦点模糊
- 当孩子获得焦点时触发模糊事件
- 初学者尝试使用焦点/模糊:JavaScript
- 如何防止在html中模糊(焦点丢失)时取消选择所选文本
- 当我失去焦点时,不会触发ng模糊
- iframe 中输入上的模糊/焦点事件(委派)
- 如果单击焦点元素的子元素,则会在获得焦点的父元素上触发模糊事件
- 在调用窗口模糊(浏览器失去焦点)时避免元素模糊处理程序
- 如何为 @Html.Editor() 编写焦点和模糊事件
- 在 nsiWindowWatcher 或 nsiWindowMediator 上监听焦点/模糊?对于火狐扩展
- Typeahead Angular JS:在输入模糊后显示焦点结果
- 将焦点返回到具有相同类的输入的模糊上
- 如何将iframe与模糊和焦点一起使用
- Chrome(也许是Safari?)激发了“;模糊”;当浏览器失去焦点时,在输入字段上显示两次
- 正确捕获选项卡焦点/模糊
- 如何在javascript中从焦点模糊事件中获取元素值
- ace编辑器的焦点/模糊方法显然不能与termlib.js集成
- 替换/重建输入元素和更新PrototypeJS焦点/模糊函数
- IE增加了文本框焦点模糊