网页中js如何获取用户选中的内容?
如何获取用户选中的内容?这里有一个问题:window.getSelection() 方法不能获取 input 标签中选中的内容,主要是因为 window.getSelection() 方法的局限性。这个方法适用于获取可
如何获取用户选中的内容?
这里有一个问题:
问题原因
input 元素的特殊性:input 元素的文本内容由
value属性管理,而非 DOM 子节点。window.getSelection()只能获取可视化的 DOM 选中区域,而 input 的文本不是以常规 DOM 子节点形式存在的。Range 对象的限制:你创建的 Range 对象只能操作普通 DOM 节点,无法访问 input 内部的文本选区。
如何获取 input 标签中选中的内容?注意,我不知道用户是选择的网页内容还是 input标签中的内容
以下代码提取统一的解决方法:
function getSelectionDetails() {
// 获取当前活动元素(焦点所在元素)
const activeElement = document.activeElement;
// 检查活动元素是否为 input 或 textarea
if (
activeElement &&
(activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA')
) {
// 处理 input/textarea 中的选中文本
const start = activeElement.selectionStart;
const end = activeElement.selectionEnd;
if (start !== null && end !== null && start !== end) {
const txt = activeElement.value.substring(start, end);
return {
type: 'input',
element: activeElement,
text: txt,
html:txt,
start:start,
end:end
};
}
}
// 处理普通网页元素中的选中文本
const selectionObj = window.getSelection();
if (selectionObj && selectionObj.rangeCount > 0) {
rangeObj = selectionObj.getRangeAt(0);
var docFragment = rangeObj.cloneContents();
//然后将docFragment渲染出来,获取其innerHTML即可。
var testDiv = document.createElement("div");
testDiv.appendChild(docFragment);
selectHtml = testDiv.innerHTML;
const selectedText = selectionObj.toString();
if (selectedText) {
return {
type: 'page',
text: selectedText,
html: selectHtml,
range: rangeObj,
selection:selectionObj
};
}
}
return null; // 没有选中内容
}// 使用示例
document.addEventListener('mouseup', () => {
const selection = getSelectionDetails();
if (selection) {
console.log(`选中类型: ${selection.type}`);
console.log(`选中内容: ${selection.text}`);
}
});为什么要增加 element、start、end、range、selection 这些返回值属性呢?
看下面的代码:
if (selection){
if ('input' === selection.type){
selection.element.focus();
selection.element.select(selection.start, selection.end);
}else{
selection.selection.empty();
selection.selection.addRange(selection.range);
}
}如果因为某种原因,你的脚本导致选中的内容取消选中状态了,
那么可以通过以上代码还原选区。
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/front/2025-05-11/2068.html
下一篇:返回列表
2025-05-11
0
0


