Как я передам ссылку на переменную во вторую функцию, как только первая функция вызовет вторую функцию внутри первой функции?

#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>