覆盖google.com匿名函数的一部分

时间:2010-11-17 03:27:08

标签: javascript function override anonymous

如果匿名声明了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上发布了一个类似的问题,作者最终以一种不适合我的黑客方式进行工作。我意识到我可以关闭即时搜索,但我喜欢它,我无法忍受我的箭头键不再起作用。

解决方案:

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

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

4 个答案:

答案 0 :(得分:3)

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

我对此问题有两点建议,不涉及重新定义函数。

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

答案 1 :(得分:2)

您可以通过捕获箭头键事件并防止它们冒泡来轻松完成此操作。

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

经过测试并可在google.com上使用

答案 2 :(得分:0)

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

答案 3 :(得分:-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/,'')

可能会起作用