Javascript “动态创建”的href错误;a「;(锚定)archive.org网站上的元素

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

我使用此代码创建“a”元素以将其添加到页面中。(在第三方网站上,它是一个用户脚本)

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
这件事只适用于解决这只袋熊的愚蠢问题