可能的方法:
一种方法可能是构建一个扩展来注入内容脚本 http://developer.chrome.com/extensions/content_scripts.html在每一页中。此内容脚本将解析 DOM 并 删除所有内容target
锚元素的属性并设置所有target
锚元素的属性_self
.
Caveats:
- 许多页面上都有动态插入的元素(包括锚元素)。
- 某些页面上存在动态变化的元素(包括锚元素)。
- 并非所有页面/选项卡都是通过链接打开的(例如某些页面可以使用window.open() https://developer.mozilla.org/en-US/docs/Web/API/Window.open).
解决方案:
你可以使用变异观察者 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver监视锚元素被插入或有它们的target
属性修改并进行适当的调整。
您仍然需要处理通过其他方式打开的选项卡(例如window.open()
)如果这对您来说非常重要(但这些情况应该非常非常少,所以可能不值得这么麻烦)。
示例代码:
清单.json:
{
"manifest_version": 2,
"name": "Test Extension",
"version": "0.0",
"content_scripts": [{
"matches": ["*://*/*"],
"js": ["content.js"],
"run_at": "document_start",
"all_frames": true
}]
}
内容.js:
/* Define helper functions */
var processAnchor = function(a) {
//if (a.hasAttribute('target')) {
// a.removeAttribute('target');
//}
a.setAttribute('target', '_self');
};
/* Define the observer for watching over inserted elements */
var insertedObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(m) {
var inserted = [].slice.call(m.addedNodes);
while (inserted.length > 0) {
var elem = inserted.shift();
[].slice.call(elem.children || []).forEach(function(el) {
inserted.push(el);
});
if (elem.nodeName === 'A') {
processAnchor(elem);
}
}
});
});
/* Define the observer for watching over
* modified attributes of anchor elements */
var modifiedObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(m) {
if ((m.type === 'attributes') && (m.target.nodeName === 'A')) {
processAnchor(m.target);
}
});
});
/* Start observing */
insertedObserver.observe(document.documentElement, {
childList: true,
subtree: true
});
modifiedObserver.observe(document.documentElement, {
attributes: true,
substree: true
});