#php #jquery #ajax
#php #jquery #ajax
Вопрос:
Я создаю страницу, на которой при нажатии на «историю» загружается текст и мультимедиа для этой истории, у меня есть отдельный PHP-скрипт для загрузки текста истории и мультимедиа (видео или изображения). оба скрипта работают, и на самом деле все это работает.
Моя проблема в том, что когда вы нажимаете на историю, предполагается, что она загружает текст, а затем перемещает носитель вниз, когда он загружен, однако он скользит вниз, даже когда текст все еще загружается.
newspaper.nmyster.co.uk / это сайт, о котором идет речь. нажмите на историю vimeo слева и посмотрите, что я имею в виду.
Код для AJAX, который загружает историю и медиа, является:
$.ajax({
url: './scripts/storyLoader.php?storyid=' storyId,
success: function(result){
$('#storycontainer').hide();
$('#loading').remove();
$('#storycontainer').hide(0).html(result).fadeIn(1000);
}
});
$.ajax({
url: './scripts/mediaLoader.php?storyid=' storyId,
success: function(result){
$('.martefact').hide();
$('#loading').remove();
$('.martefact').html(result).slideDown(1000);
}
});
В принципе, я хочу, чтобы медиа-раздел скользил вниз только после завершения загрузки видео или изображения.
Спасибо
Комментарии:
1. Пользователи с более медленными соединениями могут подумать, что что-то не работает, если им приходится ждать.
2. хммм… ну, это для проекта для университета, так что мне не придется беспокоиться об этом на самом деле … я просто хочу сделать это для эстетики
Ответ №1:
Я бы использовал что-то вроде этого:
var requestHandle;
function loadPage(url, vars) {
//cancel pending
if (requestHandle!=null)
requestHandle.abort();
//load page..
requestHandle = $.get(url, vars, function(data) {
$('#storycontainer').hide();
$('#loading').remove();
$('#storycontainer').hide(0).html(data).fadeIn(1000);
});
}
Ответ №2:
Ваш запрос является асинхронным. Это означает, что скрипт не будет ждать загрузки данных перед выполнением бита эстетики. Вам нужно добавить async: false к вашему вызову $.ajax (посмотрите другие параметры в документации jQuery). Таким образом, браузер будет ждать поступления данных первым перед выполнением остальной части JS.
Комментарии:
1. Я думал, что функция успеха вызывается только после поступления некоторых данных с сервера?
2. Попробуйте использовать async: false, и вы заметите разницу. Я бы с удовольствием объяснил, что происходит, но на данный момент мое время ограничено, возможно, вы захотите попробовать поискать в Google, что происходит с функцией success и вызовами async / синхронизировать.
3. Надеюсь, я правильно понял, если значение async равно false, выполнение кода остановится до поступления данных, а затем вызовет функцию success, но в то же время заблокирует все остальное! Если значение async равно true, обычное выполнение кода продолжится, но функция успеха будет вызвана после поступления данных… так что я не думаю, что это действительно решение, @nmyster вы пробовали это?
Ответ №3:
Что делает ваш mediaLoader.php
скрипт? Просто проверяет базу данных, есть ли какие-либо медиа-записи для данной истории, и если да, то правильно ли их форматирует и выводит? Потому что в настоящее время я не думаю, что вы можете скользить вниз после полной загрузки видео, поскольку вы встраиваете видеоконтейнер vimeo, который обрабатывает загрузку самого видео, и у вас нет к нему доступа…
Комментарии:
1. mediaLoader, если это видео, получит подробную информацию о видео, а затем вставит его, я подумал, что это может быть проблемой :/
Ответ №4:
Вам нужно использовать функцию обратного вызова ‘on complete’ для первой анимации.
Посмотрите документацию jQuery api для .fadeIn()
Это должно выглядеть примерно так:
$('#book').fadeIn('медленно', функция() { // Код для запуска после завершения анимации... });