#javascript
#javascript
Вопрос:
Я пытаюсь использовать JavaScript для управления содержимым страницы на фиктивной веб-странице, которую я создаю.
С этой целью я написал небольшую функцию с именем writeText(file_name, location)
, которая получает HTML-файл, указанный по имени файла, и печатает содержимое этого файла в innerHTML
паре <div>
тегов, атрибут id которых соответствует location
полю.
Затем я включил вызовы в другие функции, чтобы автоматизировать создание полных страниц, подобных этой.
Итак, я вызываю что-то, что выглядит следующим образом:
function displayHome() {
writeText('homeMain.html', 'mainFrame');
writeText('homeSide.html', 'sideFrame');
}
…для отображения домашней страницы.
Однако, когда я вызываю эту функцию, дисплей обновляет только 'sideFrame'
объект и не вносит никаких изменений в содержимое 'mainFrame'
. Но если я прерываю функцию предупреждением («Фиктивный») между двумя writeText()
вызовами, то оба фрейма содержимого обновляются корректно.
Мне было интересно, видел ли кто-нибудь что-нибудь подобное раньше, и знает ли кто-нибудь, как это исправить.
Для полноты картины (это было скопировано почти дословно с веб-сайта w3schools):
function writeText(script_file, location) {
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
document.getElementById(location).innerHTML = xmlhttp.responseText;
}
xmlhttp.open("GET",script_file,true);
xmlhttp.send();
}
Комментарии:
1. Дословное копирование с веб-сайта w3schools уже является ошибкой.
2. Пожалуйста, не используйте W3Schools.com в нем полно ошибок. Смотрите w3fools.com
Ответ №1:
Вы используете глобальную переменную xmlhttp, поэтому она блокируется при втором запуске функции. Сам запрос является асинхронным, поэтому второй вызов выполняется, пока первый еще выполняется.
Чтобы исправить это, используйте вместо этого локальную переменную (чтобы каждый вызов функции имел свой собственный xmlhttp), используя ключевое слово «var» перед xmlhttp:
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
Комментарии:
1. Чтобы быть более точным, первый вызов отменяется при выполнении
xmlhttp.open()
во второй раз.