Переопределение части анонимной функции google.com - PullRequest
9 голосов
/ 17 ноября 2010

Если функция 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 здесь размещен аналогичный вопрос, который автор закончил хакерским способом, который не относится ко мне.Я понимаю, что могу отключить мгновенный поиск, но мне это нравится, я просто не могу смириться с тем, что мои клавиши со стрелками больше не работают.

РЕШЕНИЕ:

Я закончил тем, что написал расширение Chrome для возврата функциональности клавиш со стрелками вверх / вниз к прокрутке.Я использовал следующий код.Спасибо Raze и Mofle.

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

Ответы [ 4 ]

3 голосов
/ 28 апреля 2011

Вы не можете переопределить анонимную функцию внутри другой анонимной функции.Вы не можете изменить части какой-либо существующей функции, вам придется создать новую функцию и присоединить ее там, где это необходимо, хотя вы можете получить источник функции, манипулировать ею и создать новую функцию из источника.

У меня есть два предложения для этой проблемы, которые не требуют переопределения функций.

  1. Добавьте прослушиватель событий для текстового поля ввода на этапе захвата и отмените событие, еслиkeyCode - UP или DOWN
  2. Создайте наложенное текстовое поле, в которое вы фактически вводите текст, и передайте все события, кроме клавиши UP и DOWN, фактическому текстовому полю внизу.
2 голосов
/ 05 мая 2011

Вы можете легко сделать это, фиксируя события со стрелками и не допуская их пузыри.

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

Проверено и работает на google.com

0 голосов
/ 04 мая 2011

Попробуйте использовать замену жесткого ядра до выполнения функции.

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

Возможно, это будет работать

0 голосов
/ 30 апреля 2011

Удалите все прослушиватели событий из элемента, заменив его собственным клоном (node.parentNode.replaceChild(node.cloneNode(true), node)), а затем примените вручную модифицированную версию кода JavaScript Google (document.documentElement.appendChild(document.createElement("script")).src="location of your modified script").

...