#jquery
#jquery
Вопрос:
У меня есть функция, которая заполняет список через AJAX.
function listCourses() {
var s= document.getElementById( 'courses' );
return $.ajax({
type: "GET",
url: "http://localhost:80/RickVideos/courseLib.xml",
dataType: "xml",
success: function( xml ){
// load array with course codes
var arr = [];
$(xml).find( 'courseCode' ).each(function() {
s.options[ s.options.length ] = new Option( $( this ).text());
});
},
error: function() {
alert("An error occurred while processing XML file." );
}
});
При вызове функции я бы хотел, чтобы во время обработки AJAX отображалось модальное диалоговое окно, а затем модальное диалоговое окно заменялось другим модальным диалоговым окном, отображающим заполненный список.
$( "#ajaxLoading #listOfCurrentProjects" ).overlay({
left: "center",
top: "center",
closeOnClick: false,
load: false
});
$( "#newCourse" ).click( function() {
$("#ajaxLoading").overlay().load();
listCourses().done(function() {
$("#ajaxLoading").overlay().close();
$("#listOfCurrentProjects").overlay().load();
});;
При newCourse
нажатии кнопки ajaxLoading
отображается диалоговое окно, а затем закрывается. listOfCurrentProjects
Диалоговое окно не отображается. При newCourse
повторном нажатии кнопки ajaxLoading
диалоговое окно отображается, а затем закрывается, заменяясь listOfCurrentProjects
диалогом. Это желаемое поведение. Почему это не происходит при первом нажатии кнопки?
Ответ №1:
Вместо этого используйте обещания, которые реализованы в jQuery 1.5 и далее, например .done()
, . Вы можете решить не использовать success
error
обратный вызов or .
var listCourses = function() {
return $.ajax({
type: "GET",
url: "http://localhost:80/RickVideos/courseLib.xml",
dataType: "xml"
});
});
Вы можете вызывать свой AJAX, когда захотите, используя listCourses()
. Вы даже можете привязать его к обработчику, почти как то, что вы сделали:
$('#newCourse').click(function() {
$('#ajaxLoading').overlay().load();
listCourses().done(function(xml) {
var s = document.getElementById('courses');
$(xml).find( 'courseCode' ).each(function() {
s.options[s.options.length] = new Option($( this ).text());
});
$("#ajaxLoading").overlay().close();
$("#listOfCurrentProjects").overlay().load();
}).error(function() {
alert("An error occurred while processing XML file." );
});
});
Вы можете сделать его еще более подробным, выполнив вызов AJAX через переменную:
var listCourses = $.ajax({
type: "GET",
url: "http://localhost:80/RickVideos/courseLib.xml",
dataType: "xml"
});
А затем просто ссылайтесь на переменную listCourses
, а не на функцию listCourse(s)
, при прослушивании щелчка на #newCourse
:
$('#newCourse').click(function() {
$('#ajaxLoading').overlay().load();
listCourses.done(function(xml) {
var s = document.getElementById('courses');
$(xml).find( 'courseCode' ).each(function() {
s.options[s.options.length] = new Option($( this ).text());
});
$("#ajaxLoading").overlay().close();
$("#listOfCurrentProjects").overlay().load();
}).error(function() {
alert("An error occurred while processing XML file." );
});
});
Комментарии:
1. Я попытался использовать переменную и исправленное событие click для #newCourse, как было предложено. Поведение такое же, как я описал изначально: для отображения #listOfCurrentProjects требуется два нажатия кнопки #newCourse .