我希望我的(ExtJS)工具栏按钮在单击时不会抓住网页上的焦点,而是在通过单击保持焦点不变的同时做它们的“事情”。我怎么做?
11 回答
取消 的默认行为会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>
来自https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex:
负值(通常)
tabindex="-1"
表示该元素应该是可聚焦的,但不应通过顺序键盘导航访问。使用 JavaScript 创建可访问的小部件最有用。
我认为没有一种简单的方法可以做你想做的事情,因为这是浏览器的默认行为。
您当然可以在单击按钮后立即 blur() 按钮,但这只会取消选择所有内容。要让先前活动的对象重新获得焦点,您必须通过为每个元素添加模糊处理程序来创建各种“记忆”,以跟踪哪个元素最后获得/失去焦点(将元素的 id 存储在全局并在元素失去焦点时更新它)。
票数最高的答案在技术上是正确的,但取决于 jQuery ......
这是一个更简单的例子:
<span onclick="document.execCommand('bold', false);" onmousedown="event.preventDefault();"></span>
我的解决方案是将其替换<button />
为<div />
按钮并将其样式化。当您单击它时,看起来 Div 并没有关注它。
因为工具栏按钮只是样式化的普通 HTML 按钮元素,所以这是一种实际的浏览器行为,在更改它之前应该三思而后行。但尽管如此...
您应该能够通过仅从false
其onclick
处理程序返回来防止按钮接收焦点。
也许您应该尝试使用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>
我发现,你必须制作一个虚拟元素,我发现按钮在这种情况下效果最好。将按钮放在 div 中并使 div 为 0px。
[不要让 div 显示 none,一些浏览器会忽略它]
基本上任何点击或按钮按下,它都会专注于这个虚拟按钮。我有一个非常相似的项目,每当他们按下向下键时,它就会选择页面上的第一个按钮,这只是一遍又一遍地关注按钮。
有点自高自大,但它有效。
所有这些答案都是古怪的。这是一个非常棒的技巧,它只使用 CSS
<button type="submit" disabled>
<span>Submit</span> <!-- the <span> is the secret -->
</button>
现在在你的 CSS 中:
button[disabled] > * {
pointer-events: none;
}
诀窍是必须使用内部跨度,否则按钮仍会从输入中窃取焦点。