Почему Chrome не запускает этот JavaScript - PullRequest
9 голосов
/ 18 апреля 2009

Когда я запускаю это в Chrome (версия 2), он не возвращает строку, но работает в Firefox (версия 3). Почему это?

<html>
<head>
<script type="text/javascript">
function disp_prompt() {
    var name=prompt("Please enter your name","Harry Potter");
    if (name!=null && name!="") {
        document.write("Hello " + name + "! How are you today?");
    }
}
</script>
</head>
<body>

<input type="button" onclick="disp_prompt()" value="Display a prompt box" />

</body>
</html>

Ответы [ 3 ]

32 голосов
/ 18 апреля 2009

Чтобы добавить содержимое в документ, вы должны вызывать document.write() только во время фазы синтаксического анализа .

Если у вас есть вызов document.write где-то, где он выполняется вне этого контекста, например, в вашем обработчике событий, анализ не выполняется, поэтому никуда не денется эта строка 'foo'.

Что должно произойти в соответствии с исходной ссылкой JavaScript :

Обработчики событий выполняются после закрытия исходного документа, поэтому метод write неявно открывает новый документ mimeType text / html, если вы явно не используете метод document.open в обработчике событий.

То есть предполагается, что вы допустили ошибку и намеревались сделать:

document.open('text/html');
document.write(html);

Что заменяет весь документ новым контентом. Вы также заметите это, потому что вы не завершили это, позвонив по номеру:

document.close();

... в Firefox тумблер «загрузки» все еще оживляет, ожидая, что в документ будет записано больше контента (но он никогда не поступит).

В этом случае вы document.write() набираете строку:

Hello bobince! How are you today?

, который явно не является действительным документом HTML. Chrome (и Safari, который ведет себя одинаково) пытается проанализировать его как документ HTML, но не удается, потому что это текстовое содержимое без пробелов за пределами элемента документа (), что недопустимо. Если вы введете несколько тегов в поле ввода имени:

Hello <em>bobince</em>! How are you today?

Вы увидите, что все элементы вне отброшены. Firefox и IE удается применить свое нарушенное HTML-правило «исправить текст вне любого элемента», чтобы спасти вас, а Chrome - нет.

Если вы хотите document.write() новый документ, вы должны убедиться, что это действительно полный документ:

<html><head><title>Greetings</title><body><p>Hello bobince! How are you today?</p></body></html>

Или, если вы хотите document.write() текстовую строку, вы должны теоретически вызвать:

document.open('text/plain');

перед записью (). Но будьте осторожны, параметр mimetype не поддерживается Chrome или Safari; они всегда будут воспринимать то, что вы пишете, как HTML.

В любом случае, вы, вероятно, не хотите использовать этот метод . Если вы хотите добавить (или изменить) существующую страницу, вы обычно должны использовать методы DOM, такие как установка текста в div вывода статуса или замена содержимого тела с помощью innerHTML.

document.write() требуется в нескольких местах (в частности, когда вы создаете новое окно или рамку с нуля), но в остальном это, как правило, неправильная вещь, и ее следует рассматривать с подозрением.

9 голосов
/ 18 апреля 2009

не используйте document.write. если вы измените его на что-то вроде

if (name != null && name != "") {
    document.getElementById('foo').innerHTML = "Hello " + name + "! How are you today?";
}

<body>
<input ...

<div id='foo'> </div>
</body>

document.write ведет себя довольно странно. Где вы ожидаете, что текст будет написан?

2 голосов
/ 18 апреля 2009

Просто добавьте несколько тегов абзаца в вызов записи:

<html>
<head>
<script type="text/javascript">

function disp_prompt() {
    var name = window.prompt("Please enter your name", "Harry Potter");
    if (name) {
        window.document.write("<p>Hello " + name + "! How are you today?<\/p>");
    }
}
</script>
</head>
<body>

<input type="button" onclick="disp_prompt()" value="Display a prompt box" />

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