Javascript bookmarklet не работает на определенных сайтах, создает новую призрачную страницу <html> - PullRequest
5 голосов
/ 12 ноября 2011

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 17 ноября 2011

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

1 голос
/ 17 ноября 2011

Если 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;
1 голос
/ 13 ноября 2011

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

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

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

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

...