Проблема:
Многократные асинхронно вызванные вызовы Effect.Appear () не все разрешаются правильно.
Справка:
У меня есть страница, которая лениво загружает 10-20 элементов с другого сервера. Из-за текущей архитектуры каждый элемент должен быть загружен с собственным HTTP-запросом (в отличие от пакетного запроса), поэтому я не могу дождаться возвращения всех этих http-запросов до завершения загрузки страницы - мне действительно нужно лениво загрузить их, чтобы получить достойный опыт.
Это работало нормально до тех пор, пока я не захотел немного покрасить его, заставив элементы постепенно исчезать, а не резко появляться на странице. Когда я пытаюсь использовать Effect.Appear (), не все элементы появляются каждый раз. Проверка элементов показывает, что запросы возвращались, и элементы dom были прикреплены, а заполнитель даже был удален. Но элемент все еще показывает style = "display: none".
Это не один и тот же элемент каждый раз, и элемент, который загружался раньше, может не загружаться должным образом при мягком обновлении, поэтому даже кэширование не помогает решить проблему.
Код:
Вот основной код, который контролирует загрузку.
Javascript:
/** create the html and attach it */
createItem = function(photoDOM, json){
//(creates this html)
// <a href="<?=$itemPage?>" target="_blank">
// <img src="<?=$itemImage?>"
// id="suggestedItemIMG_<?=$itemID?>"
// class="suggestedItemIMG <?=$itemClass?>"
// title="<?=$itemTitle?>"/>
//
// </a>
if(json.error == "removed"){
photoDOM.remove();
return false;
}
anchor = new Element('a', {
href: json.a.href,
target: '_blank'
})
img = new Element('img', {
'class': "suggestedItemIMG " + json.img.itemClass,
id: 'suggestedItemIMG_'+json.img.itemID,
'title': json.img.imgTitle
});
anchor.appendChild(img);
anchor.style.display = 'none';
photoDOM.appendChild(anchor);
img.observe('load', function(e){ //have it append to the doc after it loads and remove the placeholder
photoDOM.down('.indicator').remove();
anchor.appear({
from: 0,
to: 1
});
});
img.src = json.img.src; //start loading
}
/** make the ajax request */
loadItem = function(photoDOM){
new Ajax.Request('/ajax/get_item.php', {
parameters: { photoitem_id: photoDOM.select('.photoitem_id')[0].value },
onSuccess: function(transport){
var json = transport.responseText.evalJSON();
createItem(photoDOM, json);
}
});
}
PHP-обработчик ajax:
if($itemStatus > 99) {
echo json_encode(array("error"=>"removed"));
exit;
}
$json = array(
"a" => array("href" => $itemPage),
"img" => array(
"src" => $itemImage,
"itemID" => $itemID,
"itemClass" => $itemClass,
"imgTitle" => $itemTitle,
),
"item" => array(
"status" => $itemStatus
)
);
echo json_encode($json);
Спасибо за любую помощь.
-К