【问题标题】:Overriding a portion of a google.com anonymous function覆盖 google.com 匿名函数的一部分
【发布时间】:2010-11-17 03:27:08
【问题描述】:

如果一个 javascript 函数是匿名声明的,有没有办法覆盖它或它的一部分?

我正试图阻止 google.com 的即时搜索劫持向上和向下箭头键来移动您的搜索排名。我已经确定了我认为有问题的代码部分。键码 38 和 40 用于向下键和向上键。

if (b == 40) aa(f);
else if (b == 38) aa(j);
else if (b == 37 || b == 39) if (!ca(b == 39)) return f;
a.preventDefault && a.preventDefault();
return a.returnValue = j

问题在于这是一个名为 Sb = function (a) {} 的函数的一部分,它位于大约三千行匿名函数的内部。 SO here 上发布了一个类似的问题,作者最终以一种不适用于我的 hacky 方式解决了问题。我意识到我可以关闭即时搜索,但我喜欢它,我就是无法忍受我的箭头键不再起作用了。

解决方案:

我最终写了一个chrome extension 来将向上/向下箭头键功能恢复为滚动。我使用了以下代码。感谢 Raze 和 Mofle。

if (event.keyCode == 40 || event.keyCode == 38)  {
    event.cancelBubble = true;
    event.stopPropagation();            
    return false;
}

【问题讨论】:

  • 当前行为到底是什么?哪个是想要的?你能链接到一个例子吗??
  • @jcane86 - 基本上谷歌即时搜索会覆盖向上和向下箭头按键。这些通常滚动页面。相反,谷歌选择让这些箭头从结果列表中向下跳。我不使用鼠标,所以按向下箭头快速扫描页面效果最好。现在我必须按八次向下箭头才能在屏幕底部看到结果。
  • 为什么不能使用 pageup/pagedown 来获得所需的行为,而不是覆盖箭头键事件侦听器?
  • @ampersand - 因为向上/向下翻页是生涩的。我喜欢点击箭头键并用我的眼睛扫描。如果你用谷歌搜索这个问题,你会发现很多人不喜欢这个新行为。
  • 你不需要 cancelBubble 因为它只是 IE 并且被贬低了。你也不需要 return false。

标签: javascript function overriding anonymous


【解决方案1】:

您不能在另一个匿名函数中覆盖匿名函数。您不能更改任何现有函数的部分内容,您必须创建一个新函数并将其附加到需要的位置,尽管您可以获取函数的源代码,对其进行操作并从源代码中创建一个新函数。

我这里针对这个问题有两个建议,不涉及重新定义函数。

  1. 在捕获阶段为输入文本框添加事件监听,如果keyCode为UP或DOWN则取消事件
  2. 创建一个覆盖文本框,您可以在其中实际输入文本,并将除 UP 键和 DOWN 键之外的所有事件传递到下面的实际文本框。

【讨论】:

  • @Raze - 我会试试这些 Raze。好主意。
  • 你怎么没有得到我的全部 150 赏金?我将你标记为正确答案。
  • 我不知道。得问问管理员。
  • 从常见问题解答中获得此信息:“如果您未在 7 天内奖励您的赏金,则在赏金开始后创建的最高投票答案(至少获得 2 票赞成)将获得一半的赏金。”
  • 我要求他们奖励你另外 75 个。希望他们这样做。
【解决方案2】:

您可以通过捕获箭头键事件并防止它们冒泡来轻松做到这一点。

window.addEventListener('keydown', function(e) {
    e.stopPropagation();
}, true);

在 google.com 上测试并运行

【讨论】:

  • event.cancelBubble = true; event.stopPropagation();我根据 Raze 的反馈整理出来。
  • cancelBubble 仅适用于 IE 且已弃用。所以在你的情况下,它是不需要的。
【解决方案3】:

通过将元素替换为自身的克隆 (node.parentNode.replaceChild(node.cloneNode(true), node)) 从元素中删除所有事件侦听器,然后应用手动修改的 Google JavaScript 代码版本 (document.documentElement.appendChild(document.createElement("script")).src="location of your modified script@987654324 @)。

【讨论】:

  • 谢谢你的想法,但随着谷歌修改他们的 js,我不想不断更新我手动修改的版本。
【解决方案4】:

在函数执行前尝试使用硬核替换。

document.body.innerHTML = document.body.innerHTML.replace(/if (b == 40) aa(f);/,'').replace(/else if (b == 38) aa(j);/,'').replace(/else if (b == 37 || b == 39) if (/a.preventDefault && a.preventDefault();/,'').replace(/return a.returnValue = j/,'')

可能会成功

【讨论】:

  • 好主意,但我认为这行不通。 javascipt 在 js 文件中,而不是在正文中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2014-06-08
相关资源
最近更新 更多