Функция JavaScript на объекте окна, когда вызывается, заменяет содержимое этого окна?(иногда??) - PullRequest
2 голосов
/ 12 апреля 2011

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

<html><head><script>
function sideEffect() { console.log("Side effect happened. Wewt."); }
window.foo = function() {
    sideEffect();
    return true;
}
window.bar = function() {
    sideEffect();
}
</script></head>
<body>
<a href="javascript:window.foo();">Replaces entire window with "true"</a>
<br />
<a href="javascript:window.bar();">Doesn't</a>
</body></html>

Почему именно вызов функции с возвращаемым значением решает заменить содержимое окна?Это происходит в Firefox и Opera, но не в IE9, Chrome или Safari (все протестированы на Win7).

Итак, вопрос таков: есть ли какая-то документация, которая описывает это поведение?Или это (известная) ошибка в FF / Opera?


[править] Интересно (согласно ответам и комментариям таким образом) кажется, что злоупотребление объектом window - это красная сельдь здесь.

Ответы [ 3 ]

7 голосов
/ 12 апреля 2011

Ваш код работает отлично - браузер делает именно то, что вы говорите.

Строки JavaScript действительны в строке URL веб-браузеров, и браузер выполнит их немедленно.(Попробуйте: напишите окно предупреждения в строке URL, нажмите ввод и посмотрите, что произойдет.) Записывая свой JavaScript в href ваших тегов привязки, вы устанавливаете местоположение браузера (другими словамиURL) к этой строке JavaScript.Поскольку одна из ваших функций возвращает значение, документ перезаписывается этим значением;это нормальное поведение браузера.

1 голос
/ 12 апреля 2011

просто поставьте void(0); после ваших звонков:

<a href="javascript:window.foo();void(0);">

Если он все еще делает это (я не думаю, что это будет), добавьте `||false ':

<a href="javascript:window.foo()||0;void(0);">

И игнорируйте комментарии "не делай этого" - нет ничего плохого в том, что ты делаешь, но все window. бессмысленны (все в window в любом случае)

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

Ну, это действительно плохая форма использовать URL-адреса "javascript:" в любом случае. Создайте атрибут «onclick», если вам абсолютно необходимо привязать обработчики событий таким образом, или (лучше) сделать это с помощью ненавязчивого кода.

Это поведение довольно старое; браузеры, которые делают это, ведут себя так с древних времен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...