单击 link 时,Tampermonkey 对 href 的更改将恢复

Tampermonkey change to href reverts when link is clicked

我想使用 Tampermonkey 更改 ID 为 "apple" 的元素中的 href

我的代码有效,它将 href 更改为 www.google.com。但是,当我单击 link 时,它会将我带到旧网站 www.somewebsite.com

我不知道为什么会这样。 Tampermonkey 会不会 运行 我的脚本迟到了?就好像浏览器已经缓存了旧的 href,所以虽然 jQuery 脚本已经改变了 href,但是当点击按钮时它会将你带到旧的网站?

<div>
<a id="apple" href="www.somewebsite.com">click to visit my website<a/>
</div>

var GMnode,GMelID;
  GMelID="nav-questions";
  GMnode=document.getElementById("apple");
  if((GMnode!==null)&&(GMnode.hasAttribute("href"))){
    GMnode.setAttribute("href","http://www.google.com/");
  }

// ==UserScript==
// @name         Apple
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  testing!
// @author       You
// @match        *://*/*
// @run-at       document-end
// @require      https://code.jquery.com/jquery-3.3.1.min.js
// @grant        none
// ==/UserScript==

问题需要 MCVE 或 link 到实际页面。

我们无法判断发生了什么,因为尚未提供所需的示例,但页面使用各种技术来屏蔽或重写 link。他们这样做是出于邪恶的目的——或者是为了广告(但我重复一遍)——目的。

因此,您的脚本失败可能是因为它触发得太早,也可能是因为页面正在重写 link 就在您单击它时。

  1. 当您将鼠标悬停在 link 上时,它显示 www.google.com 还是 www.somewebsite.com
  2. 当您在没有启用 javascript 的情况下加载页面时会发生什么?

无论如何,有时有用的方法是忽略 link 并创建自己的,如下所示:

// ==UserScript==
// @name     Apple
// @match    *://YOUR_SERVER.COM/YOUR_PATH/*
// @run-at   document-end
// @require  https://code.jquery.com/jquery-3.3.1.min.js
// @grant    GM_addStyle
// ==/UserScript==
//- The @grant directive is needed to restore the proper sandbox.
/* global $ */
/* eslint-disable no-multi-spaces */

var targId      = "apple";
var badLink     = $("#" + targId);
var goodLink    = badLink.clone ().attr ("id", `TM${targId}`).attr ("href", "https://www.google.com/");

badLink.hide ().after (goodLink);

但是有些页面更难以编写脚本。 提供您所见内容的工作示例。