我希望我的(ExtJS)工具栏按钮在被点击时不抓取网页上的焦点,而是在保持点击不变的情况下执行它们的功能。如何做到这一点?
onmousedown
行为可以防止元素获得焦点:// Prevent capturing focus by the button.
$('button').on('mousedown',
/** @param {!jQuery.Event} event */
function(event) {
event.preventDefault();
}
);
document.activeElement 存储当前聚焦的元素。
因此,在您的工具栏上,您可以向此函数添加一个 "mousedown" 处理程序:
function preventFocus() {
var ae = document.activeElement;
setTimeout(function() { ae.focus() }, 1);
}
试试这个例子:
<html>
<head>
<script>
function preventFocus() {
var ae = document.activeElement;
setTimeout(function() { ae.focus() }, 1);
}
</script>
</head>
<body>
<input type="text"/>
<input type="button" onmousedown="preventFocus()" onclick="alert('clicked')" value="Toolbar" />
</body>
</html>
<button
tabindex="-1"
onclick="javascript:console.log('do your thing')"
>My Button</button>
一个负数值(通常是
tabindex="-1"
)意味着该元素应该可以获得焦点,但不应该通过顺序键盘导航可到达。它主要用于使用JavaScript创建可访问的小部件。
最受欢迎的答案在技术上是正确的,但依赖于jQuery...
这里有一个更简单的例子:
<span onclick="document.execCommand('bold', false);" onmousedown="event.preventDefault();"></span>
<div />
替换 <button />
,并将其样式设置为按钮。
看起来当你点击它时,Div 没有被聚焦。由于工具栏按钮只是样式化的普通 HTML 按钮元素,因此这是实际的浏览器行为,您在更改它之前应该三思而后行。但尽管如此...
您应该能够通过从其 onclick
处理程序返回 false
来防止按钮获得焦点。
stateful
和状态改变属性来处理表单字段或其他内容,以便重新获得焦点?
<script>
function focusor(){
document.getElementById('focus').focus;
}
document.onkeydown = focusor;
document.onclick = focusor;
</script>
<div style="width: 0px; height: 0px; overflow: hiddden;">
<button id="focus"></button>
</div>