Javascript “动态创建”的href错误;a「;(锚定)archive.org网站上的元素
我使用此代码创建“a”元素以将其添加到页面中。(在第三方网站上,它是一个用户脚本)Javascript “动态创建”的href错误;a「;(锚定)archive.org网站上的元素,javascript,google-chrome-extension,userscripts,Javascript,Google Chrome Extension,Userscripts,我使用此代码创建“a”元素以将其添加到页面中。(在第三方网站上,它是一个用户脚本) let anchor=document.createElement(“a”); anchor.href=新URL(“https://duckduckgo.com"); 控制台日志(锚); //anchor.target=“_blank”; //anchor.rel=“nofollow noopener noreferrer”; //anchor.click(); 在控制台中运行此代码以进行检查 除了web.ar
let anchor=document.createElement(“a”);
anchor.href=新URL(“https://duckduckgo.com");
控制台日志(锚);
//anchor.target=“_blank”;
//anchor.rel=“nofollow noopener noreferrer”;
//anchor.click();
在控制台中运行此代码以进行检查
除了web.archive.org
例如:
在
我明白了
但是应该
。单击()
(在上面)会打开错误的URL
如何修复它
它发生在Chrome和Firefox中
UPD:
窗口。打开(“https://duckduckgo.com“
也会出错
它将打开
https://web.archive.org/web/20080820060021/http://duckduckgo.com/
取而代之的是https://duckduckgo.com/
发生这种情况是因为该站点上的Javascript正在覆盖htmlanchoreElement.prototype.href
:
覆盖本机原型是一种不好的做法,会导致类似这些令人困惑的错误
对于用户脚本,您可以通过在pageload开头保存对href
属性描述符的引用来修复它,然后在错误的内置代码尝试重新分配它之后,将它重新分配给HtmlanchoreElement.prototype.href
:
// ==UserScript==
// @name 0 New Userscript
// @include https://web.archive.org/web/19961220154510/https://www.yahoo.com/
// @run-at document-start
// @grant none
// ==/UserScript==
const originalHrefDescriptor = Object.getOwnPropertyDescriptor(HTMLAnchorElement.prototype, 'href');
window.addEventListener('DOMContentLoaded', () => {
Object.defineProperty(HTMLAnchorElement.prototype, 'href', originalHrefDescriptor);
// Now, assigning to .hrefs results in normal behavior again
});
确保使用/@run at document start
确保您的userscript在页面上的任何代码运行之前运行-这样,您可以在描述符被覆盖之前保存对描述符的引用
对于wombat的这种特殊情况,您还可以为a
a\u no\u rewrite
属性,而不是保存描述符:
const a = document.createElement('a');
a._no_rewrite = true;
a.href = 'https://www.google.com';
这是因为该站点上的Javascript正在覆盖
htmlanchorement.prototype.href
:
覆盖本机原型是一种不好的做法,会导致类似这些令人困惑的错误
对于用户脚本,您可以通过在pageload开头保存对href
属性描述符的引用来修复它,然后在错误的内置代码尝试重新分配它之后,将它重新分配给HtmlanchoreElement.prototype.href
:
// ==UserScript==
// @name 0 New Userscript
// @include https://web.archive.org/web/19961220154510/https://www.yahoo.com/
// @run-at document-start
// @grant none
// ==/UserScript==
const originalHrefDescriptor = Object.getOwnPropertyDescriptor(HTMLAnchorElement.prototype, 'href');
window.addEventListener('DOMContentLoaded', () => {
Object.defineProperty(HTMLAnchorElement.prototype, 'href', originalHrefDescriptor);
// Now, assigning to .hrefs results in normal behavior again
});
确保使用/@run at document start
确保您的userscript在页面上的任何代码运行之前运行-这样,您可以在描述符被覆盖之前保存对描述符的引用
对于wombat的这种特殊情况,您还可以为a
a\u no\u rewrite
属性,而不是保存描述符:
const a = document.createElement('a');
a._no_rewrite = true;
a.href = 'https://www.google.com';
谢谢我认为问题在于站点URL包含另一个URL。哇,我从来没有听说过
\u no\u rewrite
,但它很有效。Upd:\u no\u rewrite
它不是标准属性,但它是wombat.js API的一部分。(只是提醒一下)是的,\u no\u rewrite
只适用于解决这只袋熊的愚蠢问题谢谢!我认为问题在于站点URL包含另一个URL。哇,我从来没有听说过\u no\u rewrite
,但它很有效。Upd:\u no\u rewrite
它不是标准属性,但它是wombat.js API的一部分。(只是提醒一下)是的,\u no\u rewrite
这件事只适用于解决这只袋熊的愚蠢问题