Javascript .each функция работает ненормально

0

У меня есть эта функция

function Overlap() {
setTimeout(function() {
    $(".overlap").each(function(index, object) {
        var image = $(this).prev().attr('src');
        target = $(object);
        var xmlhttp
        xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
            if(xmlhttp.status == 200 && xmlhttp.readyState == 4) {
                xresponse = xmlhttp.responseText.split('-');
                $(target).children('a').attr('href', xresponse[0]);
                $(target).children('.name').html(xresponse[1]); //Set returned array appropriately
                $(target).children('.age').html(xresponse[2]);
                $(target).children('.specialization').html(xresponse[3]);
            }
        }
        xmlhttp.open('POST', 'factory/operational.php', true);
        xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        xmlhttp.send('overlap=overlap&image=' + image);
    });
}, 1000);

}

Html:

<div class="Divbox" id="Box_three"><img src='<?php ?>' />
    <div class="overlap">
        <a href='' class='name'></a>
        <div class='age'></div>
        <div class='specialization'></div>
    </div>
</div>

И это вызвано этим

window.onload = Overlap();

На странице, которая его использует Проблема заключается в том, что функция работает. Обычно ее называют надлежащим образом, и я устанавливаю функции window.onload & setTimeout, чтобы убедиться, что страница загружается полностью, прежде чем пытаться захватить элемент.overlap. Теперь не так, когда наложено перекрытие, на странице находится около 48 элементов.overlap div, и все они отправляют этот запрос на страницу oper.php, но по прибытии обратно они не подходят должным образом, они подходят только на последний элемент, который возвращается из файла operating.php, может кто-то помочь мне найти правильный экземпляр селектора для передачи, чтобы убедиться, что каждый экземпляр перекрытия и есть дети, которые получают ответ

  • 0
    Какова ваша структура HTML?
  • 2
    Если ваша функция не window.onload = Overlap; с помощью window.onload = Overlap; вместо? Потому что в вашем случае функция запускается сразу, а не при загрузке страницы, как вы и предполагали; и вы устанавливаете window.onload для возвращаемого значения вашей функции.
Показать ещё 7 комментариев
Теги:

1 ответ

4
Лучший ответ

вы пропустили объявление своей целевой переменной, сделав ее глобальной.

target = $(object);

должно быть

var target = $(object);

без var, каждая итерация цикла будет использовать одну и ту же target, что означает, что все запросы запроса xhr будут использовать одну и ту же цель.

Пример:

$.each(["a","b","c"], function(i,val) {
    x = val;
    console.log(x); // "a", "b", "c"
});
console.log(x); //"c"

После завершения каждого из них x будет глобальным var, который содержит значение из последней итерации. В вашем коде вы выполняете асинхронное действие на каждой итерации, то есть обратные вызовы для каждого действия будут выполняться после завершения каждого из них, поэтому target указывает на последнюю итерацию для всех обратных вызовов.

  • 0
    Супер правильно! .. я думаю, что это просто сработало! ... пожалуйста, объясните это дерьмо!
  • 0
    Я обновил его с базовым объяснением, этого достаточно? На самом деле не уверен, как это объяснить, кроме как указывать на код
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню