javascript - 为什么同一个事件会识别不同的activeElements?
问题描述
如果我点击一个按钮,那activeElement
就是按钮。
如果我留下一个输入框,那activeElement
就是窗口。
如果我通过单击按钮离开输入框,那么activeElement
是...两者?
为什么onfocusout
事件的注册与activeElement
按钮不一样?无论如何我可以从输入框离开事件的函数调用中访问点击按钮事件吗?
即我可以问,“你离开我是为了那个糟糕的按钮吗?”
<button type="button" onclick = "myFunction()"> button </button><br>
<input type="text" onfocusout= "myFunction()"> </input>
<script>
function myFunction() {
console.log(document.activeElement);
}
</script>
解决方案
Document 接口的activeElement
只读属性返回 DOM 中当前具有焦点的元素。
如果 activeElement 当时有文本选择,通常会返回一个 HTMLInputElement 或 HTMLTextAreaElement 对象。如果是这样,您可以通过使用对象的selectionStart
和selectionEnd
属性来获得更多详细信息。
另外,离开输入元素时确实可以触发按钮点击,只需要确保处理好onfocusout函数,并使用函数内部的代码触发点击事件,可以参考这里。
function onMouseUp(e) {
const activeTextarea = document.activeElement;
const selection = activeTextarea.value.substring(
activeTextarea.selectionStart, activeTextarea.selectionEnd
);
const outputElement = document.getElementById('output-element');
const outputText = document.getElementById('output-text');
console.log({ id: activeTextarea.id, selection});
}
const textarea1 = document.getElementById('textarea1');
const textarea2 = document.getElementById('textarea2');
textarea1.addEventListener('mouseup', onMouseUp, false);
textarea2.addEventListener('mouseup', onMouseUp, false);
<textarea name="textarea1" id="textarea1" rows="7" cols="40">This is Text Area One.</textarea>
<textarea name="textarea2" id="textarea2" rows="7" cols="40">This is Text Area Two</textarea>
推荐阅读
- c# - 从面板截取屏幕截图
- java - 在链表中查找最小值
- c++ - OpenCV简单的斑点检测器不起作用
- apache - Apache 虚拟主机中的错误
- c# - 调试 C# 程序调用的 Powershell 脚本
- javascript - 初始化 Croppie 以上传和裁剪图像
- python - Django - 'for' 语句应该至少有四个词:for selection question_set.all
- c++ - 无法在另一个线程上使用库
- macros - 为什么/如何/何时在 Phoenix Controller/View/etc 中使用 __using__(which) 宏?
- c++ - 最佳实践是在方法中传递一个参数