У меня есть эта функция
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, может кто-то помочь мне найти правильный экземпляр селектора для передачи, чтобы убедиться, что каждый экземпляр перекрытия и есть дети, которые получают ответ
вы пропустили объявление своей целевой переменной, сделав ее глобальной.
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
указывает на последнюю итерацию для всех обратных вызовов.
window.onload = Overlap;
с помощьюwindow.onload = Overlap;
вместо? Потому что в вашем случае функция запускается сразу, а не при загрузке страницы, как вы и предполагали; и вы устанавливаетеwindow.onload
для возвращаемого значения вашей функции.