#javascript #ajax
#javascript #ajax
Вопрос:
В функции change_text() я пытаюсь передать ей переменную xmhttp.responsetext .. но как я это сделаю? Поскольку я пока не вижу способа, как это передать?
<script type="text/javascript">
function ajax(url, func) {
this.url = url;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 2 amp;amp; xmlhttp.status == 200) {
this.func = func;
}
}
xmlhttp.open();
xmlhttp.send()
}
function change_text() {
target = document.getElementById("x");
target.innerHTML = xmlhttp.responseText;
}
ajax("url.php", change_text);
</script>
Ответ №1:
На самом деле, для этого вы вообще не хотите использовать this
, поскольку вы не создаете никаких экземпляров объекта, и он не действует как конструктор.
Вы можете просто:
function ajax(url, func) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4 amp;amp; xmlhttp.status == 200) {
// note: loaded is 4 ^
func(xmlhttp.responseText);
}
}
xmlhttp.open('GET', url, true);
// ^~~ you also forgot to pass parameters here
xmlhttp.send('');
}
Это заставило бы ajax
функцию работать.
Для вашей change_text
функции это не та же функция, что ajax
, поэтому у нее нет доступа к xmlhttp
переменной. Однако ajax
функция передала ей responseText, поэтому просто заставьте вашу функцию его получить:
function change_text(responseText) {
var target = document.getElementById("x");
// ^~~ don't forget to declare local variables with `var`.
target.innerHTML = responseText;
}
Рабочий пример смотрите в jsFiddle.
Комментарии:
1. Вызов функции-конструктора без ключевого слова new приводит к загрязнению глобальной области видимости.
Ответ №2:
Измените this.func = func;
на this.func = function () { func(xmlhttp.responseText); };
Ответ №3:
<script type="text/javascript">
function ajax(url, func) {
this.url = url;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 2 amp;amp; xmlhttp.status == 200) {
func(xmlhttp);
}
}
xmlhttp.open();
xmlhttp.send()
}
function change_text(xmlhttp) {
target = document.getElementById("x");
target.innerHTML = xmlhttp.responseText;
}
ajax("url.php", change_text);
</script>
Вы должны вызвать свой обратный вызов с параметрами. Также обратите внимание, что this.url = url
просто устанавливает window.url = url
, что, вероятно, является ошибкой.
Вы, вероятно, хотите xmlhttp.open("POST", url)
вместо этого.
Ответ №4:
Майк Сэмюэль почти корректен, но change_text
отсутствует аргумент, попробуйте это:
<script type="text/javascript">
function ajax(url, func) {
this.url = url;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
//did you mean: func(xmlhttp.responseText);
if(xmlhttp.readyState == 2 amp;amp; xmlhttp.status == 200) {
this.func = function() {
func(xmlhttp.responseText);
};
}
}
xmlhttp.open();
xmlhttp.send()
}
function change_text(responseText) {
target = document.getElementById("x");
target.innerHTML = responseText;
}
ajax("url.php", change_text);
</script>