9

如果一个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 扩展来将向上/向下箭头键功能恢复为滚动。我使用了以下代码。感谢 Raze 和 Mofle。

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

4 回答 4

3

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

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

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

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

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

在 google.com 上测试并运行

于 2011-05-04T20:09:51.947 回答
0

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

于 2011-04-30T01:38:39.670 回答
-1

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

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/,'')

可能它会工作

于 2011-05-04T16:57:25.893 回答