【问题标题】:How to replace onclick event with GreaseMonkey?如何用 GreaseMonkey 替换 onclick 事件?
【发布时间】:2012-04-27 10:44:20
【问题描述】:

这个网站有一个图片库。每次我单击缩略图时,它都会在新选项卡中打开 URL(不是因为我将 firefox 设置为在新选项卡中打开链接)。我只想在同一个窗口中打开 URL。缩略图的外观示例如下。

<span class="thumb" id="789">
<a href="/post/image/12345" onclick="return PostMenu.click(12345)">
<img  class="preview" src="http://abc.com/image.jpg" title="title" alt="">
</a>
</span>

我相信onclick="return PostMenu.click(12345)" 正在这样做。如何在 GreaseMonkey 中用我自己的空函数替换 PostMenu.click() 函数?有没有办法让 GreaseMonkey 脚本拦截所有 onclick 事件?

我唯一的其他选择是遍历所有span 类并从链接标签中删除onclick="return PostMenu.click(12345)"。但由于单个页面上可能有超过一百个,我宁愿不这样做。

【问题讨论】:

  • PostMenu.click的代码是什么,比window.open()多吗?

标签: javascript greasemonkey


【解决方案1】:

其实,删除onclicks 一点也不繁重。

使用 jQuery,代码只是:

$("span.thumb a").prop ("onclick", null);

或者,对于旧版本的 jQuery:

$("span.thumb a").removeAttr ("onclick");

一个完整的脚本:

// ==UserScript==
// @name     _Kill select onClicks
// @include  http://YOUR_SERVER/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// ==/UserScript==

$("span.thumb a").prop ("onclick", null);


这种方法的优点是:
(1) 您保留 PostMenu.click() 以备不时之需,或者在其他地方需要它,
(2) 您正在从页面中删除杂物,这使它不那么笨拙。
(3) 我怀疑您可能还需要解包或修改该链接——在这种情况下,使用 jQuery 的目标重写方法是可行的方法。


如果你真的只是想用你自己的空函数替换 PostMenu.click() 函数,那么代码就是:

unsafeWindow.PostMenu.click = function () {};

至于让 Greasemonkey 拦截所有onclick 事件......这并不容易可靠地做到。除非出于某种原因(在这种情况下似乎没有),否则请忘记这种方法。

【讨论】:

  • 只是想知道,对于prop 脚本,一旦页面加载...它会立即执行吗?它实际上是否删除了onclick 属性?我对其进行了测试,它不再在新选项卡中打开,但是当我检查源代码时,onclick 属性仍然存在。一个小问题是该站点具有自动分页功能,因此当我向下滚动时,会生成更多缩略图,因此prop 脚本不适用于新填充的缩略图。第二个脚本工作正常。
  • 实际上考虑一下,我猜它在新标签页中打开的原因是由于自动分页,因为按下返回使其必须从头重新加载。关闭自动分页,单击链接会在同一选项卡中打开。
  • 是的,prop 代码只触发一次,并且在初始页面加载后由 AJAX 添加的链接不受影响。您可以编写一个脚本来检查并删除出现的onclicks,但听起来您已经有了解决方法和/或空函数方法。
猜你喜欢
  • 2012-03-11
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2010-11-30
  • 2013-09-26
相关资源
最近更新 更多