Javascript букмарклет терпит неудачу на определенных сайтах, создает призрачные новые страницы


Я заметил, что мой букмарклет Javascript терпел неудачу на некоторых сайтах, таких как Google Reader и Google search results pages (и случайно на некоторых сайтах, не относящихся к Google). Глядя на консоль, я мог видеть, что для этих страниц щелчок букмарклета не добавлял элементы к голове / телу, как это обычно делается, а создавал новый документ, который выглядел следующим образом:

<html>
  <head></head>
  <body></body>
</html>

Даже когда я уменьшил свой букмарклет до javascript:alert(window.location.href);, он создал бы эту пустую страницу и запустил бы букмарклет на ней, так что что тревога показала about:blank. На большинстве сайтов эта пустая страница не создается и отображается правильное расположение.

Может ли кто-нибудь объяснить это? Являются ли эти сайты песочницей для внешнего запуска кода в качестве меры безопасности?

UPDATE : в настоящее время я не могу воспроизвести это в браузерах, отличных от Chrome 17.0.932.0 dev. Пожалуйста, дайте мне знать, если кто-то еще может воспроизвести эти результаты на Chrome или иным образом.

3 5

3 ответа:

Я думаю, что это ошибка в Google Chrome, я подал его в их базу данных ошибок: https://bugs.webkit.org/show_bug.cgi?id=72606

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

Обычно это делается путем обертывания всего в void():

javascript:void(alert(window.location.href));

Очень странно, что он разрывается с alert(), хотя сама функция ничего не возвращает...

Если url-адрес javascript: возвращает строку, он будет использован для создания нового документа:

javascript:'foo bar baz';

Это может быть трудной проблемой для отладки, если вы не знаете, чтобы следить за ним. Он может появиться, если вы используете функцию, возвращающую строку, или заканчиваете букмарклет строкой, задающей строковое значение:

javascript: a = prompt('foo bar baz'); b = a;

Простое решение заключается в использовании замыкания:

javascript:(function(){ var a; a = prompt('foo bar baz'); window.b = a}());

Альтернативой является окончание на void 0;

javascript: a = prompt('foo bar baz'); b = a; void 0;