方法1:使用替代的DOM遍历和事件劫持方式:
(function() {
// 使用改进的方法清除限制
function enableTextSelection() {
// 创建并应用强制允许选择的样式
const style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = `
* {
-webkit-user-select: text !important;
-moz-user-select: text !important;
-ms-user-select: text !important;
user-select: text !important;
-webkit-touch-callout: default !important;
}
::selection {
background: #3390ff !important;
color: #fff !important;
}
`;
document.head.appendChild(style);
// 递归地移除所有限制
function processNode(node) {
if (node.nodeType === 1) { // 元素节点
node.style.setProperty('user-select', 'text', 'important');
node.style.setProperty('-webkit-user-select', 'text', 'important');
node.style.setProperty('-moz-user-select', 'text', 'important');
node.style.setProperty('-ms-user-select', 'text', 'important');
// 移除可能的事件监听器
node.oncontextmenu = null;
node.onselectstart = null;
node.ondragstart = null;
node.onmousedown = null;
node.onmouseup = null;
node.oncopy = null;
// 处理所有子节点
for (let i = 0; i < node.childNodes.length; i++) {
processNode(node.childNodes[i]);
}
}
}
// 处理整个文档
processNode(document.documentElement);
// 使用事件捕获拦截所有阻止选择的尝试
const events = ['selectstart', 'mousedown', 'mouseup', 'contextmenu', 'copy', 'dragstart'];
events.forEach(eventType => {
document.addEventListener(eventType, function(e) {
e.stopImmediatePropagation();
return true;
}, true);
// 尝试完全移除这些事件的所有监听器
const old = Element.prototype.addEventListener;
Element.prototype.addEventListener = function(type) {
if (events.includes(type)) {
// 不添加这些类型的事件监听器
return;
}
return old.apply(this, arguments);
};
});
}
// 立即执行一次
enableTextSelection();
// 每秒执行一次,以应对动态加载的内容或动态添加的限制
setInterval(enableTextSelection, 1000);
console.log("强制文本选择功能已启用");
})();
方法2:如果你只是想获取页面内容而不一定需要选择和复制,可以使用这个方法来获取页面文本:
(function() {
// 提取所有可见文本
function getAllVisibleText() {
const textNodes = [];
function extractText(node) {
if (node.nodeType === 3) { // 文本节点
const text = node.textContent.trim();
if (text) textNodes.push(text);
} else if (node.nodeType === 1) { // 元素节点
// 检查节点是否可见
const style = window.getComputedStyle(node);
if (style.display !== 'none' && style.visibility !== 'hidden') {
// 遍历子节点
for (let i = 0; i < node.childNodes.length; i++) {
extractText(node.childNodes[i]);
}
}
}
}
extractText(document.body);
// 创建一个临时元素来显示提取的文本
const div = document.createElement('div');
div.style.cssText = `
position: fixed;
top: 10px;
left: 10px;
right: 10px;
bottom: 10px;
background: white;
color: black;
padding: 20px;
z-index: 999999;
overflow: auto;
border: 2px solid black;
font-family: Arial, sans-serif;
font-size: 14px;
white-space: pre-wrap;
user-select: text;
`;
div.innerHTML = `
<h2>页面文本内容 (可以选择和复制)</h2>
<button id="closeBtn" style="position:absolute;top:10px;right:10px;padding:5px;">关闭</button>
<button id="copyBtn" style="position:absolute;top:10px;right:70px;padding:5px;">复制全部</button>
<hr>
<div style="margin-top: 40px;">${textNodes.join('\n\n')}</div>
`;
document.body.appendChild(div);
// 添加按钮功能
document.getElementById('closeBtn').onclick = function() {
document.body.removeChild(div);
};
document.getElementById('copyBtn').onclick = function() {
const textToCopy = textNodes.join('\n\n');
navigator.clipboard.writeText(textToCopy)
.then(() => alert('文本已复制到剪贴板'))
.catch(err => console.error('复制失败: ', err));
};
}
getAllVisibleText();
console.log("已提取页面文本内容到可选择区域");
})();
方法3:尝试使用缓慢选择方法(有时网站只阻止快速选择):
(function() {
// 先应用所有可能的选择样式
const style = document.createElement('style');
style.innerHTML = '* {user-select: text !important; -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important;}';
document.head.appendChild(style);
// 尝试禁用所有JavaScript事件(这可能会破坏页面功能,但可以暂时让你复制文本)
function disableJS() {
const disableFor = 10; // 秒
// 创建覆盖层通知用户
const overlay = document.createElement('div');
overlay.style.cssText = 'position:fixed;top:0;left:0;right:0;background:rgba(0,0,0,0.8);color:white;padding:20px;z-index:999999;text-align:center;';
overlay.innerHTML = `
<p>已临时禁用JavaScript (${disableFor}秒)。</p>
<p>现在尝试选择文本。</p>
`;
document.body.appendChild(overlay);
// 备份并破坏主要事件函数
const old = {
addEventListener: EventTarget.prototype.addEventListener,
removeEventListener: EventTarget.prototype.removeEventListener,
dispatchEvent: EventTarget.prototype.dispatchEvent
};
// 禁用事件系统
EventTarget.prototype.addEventListener = function(){};
EventTarget.prototype.removeEventListener = function(){};
EventTarget.prototype.dispatchEvent = function(){return true;};
// 设置计时器恢复功能
setTimeout(() => {
EventTarget.prototype.addEventListener = old.addEventListener;
EventTarget.prototype.removeEventListener = old.removeEventListener;
EventTarget.prototype.dispatchEvent = old.dispatchEvent;
document.body.removeChild(overlay);
}, disableFor * 1000);
}
// 执行
disableJS();
})();
如果这些方法都不起作用,最后的选择是尝试使用浏览器的阅读模式(如果可用),或考虑使用网页截图工具然后通过OCR软件提取文本。