javascript - 选择整个元素时,focusNode 返回 undefined
问题描述
我需要识别文本选择的开始和结束 <p> 元素的 ID。我写了以下内容:
$(document).on('keydown', function ( e ) {
if ((e.metaKey ) && (String.fromCharCode(e.which).toLowerCase() === 'c') ) {
var selectedText = document.getSelection();
if (selectedText && selectedText != '') {
var selectedBeginId = $(selectedText.anchorNode.parentNode).attr('id');
var selectedEndId = $(selectedText.focusNode.parentNode).attr('id');
alert(selectedBeginId + ' - ' + selectedEndId);
} else {
alert('No passage selected');
}
}
});
HTML 是这样的:
<body>
<p id="p-001">1 Lorem ipsum</p>
<p id="p-002">2 Lorem ipsum</p>
<p id="p-003">3 Lorem ipsum</p>
<p id="p-004">4 Lorem ipsum</p>
<p id="p-005">5 Lorem ipsum</p>
<p id="p-006">6 Lorem ipsum</p>
</body>
当我选择一些文本范围并按 meta+c 时,它会显示开始和结束 <p> id。但是,如果选择在段落末尾结束,则有时它会将 selectedEndId 返回为undefined。谁能解释为什么以及如何解决它?我在 Safari、Chrome 和 Opera 中观察到了这个错误,但在 FF 中没有。谢谢你的帮助。
解决方案
我能够重新创建问题,当您选择一行然后通过在第一个字符之前停止(很难解释)而选择下面的一行时会发生这种情况。
问题是浏览器认为您选择了正文,我无法解释,但我找到了解决方案,这是一个适合我的代码:
var selectedEndId;
if($(selectedText.focusNode.parentNode)[0] != document.body){
selectedEndId = $(selectedText.focusNode.parentNode).attr('id');
}else{
selectedEndId = selectedBeginId;
}
我在该行下方添加了它:
var selectedBeginId = $(selectedText.anchorNode.parentNode).attr('id');
如您所见,我的代码有效,但可能会带来其他问题。我希望我能让你走上正轨!
推荐阅读
- regex - 如何使用正则表达式使用 foldLeft
- python - 如何在 Pygame 中创建更多对象?
- javascript - 使用动态值在车把文件中创建 d3.js 图形
- ios - 从应用程序崩溃 iOS 中获取错误或堆栈跟踪
- node.js - 库 cbor 在转换中引入了一个新值
- android - 如何修复底部工作表对话框的出现位置
- ios - Google SignIn - 始终返回“用户取消了登录流程”
- vaadin - 使用 CSS 文件设置 vaadin 组件(对话框)的样式
- python-3.x - 按日期按月对df进行排序
- c++ - 在什么情况下重命名文件是 Linux 上的原子操作?