Передать переменную в функцию в jQuery AJAX success callback
Я пытаюсь предварительно загрузить некоторые изображения с помощью вызова AJAX jQuery, но у меня возникли реальные проблемы с передачей строки (url) в функцию в функции успеха вызова AJAX (если это имеет смысл).
вот мой код, как он есть:
//preloader for images on gallery pages
window.onload = function() {
setTimeout(function() {
var urls = ["./img/party/"]; //just one to get started
for ( var i = 0; i < urls.length; i++ ) {
$.ajax({
url: urls[i],
success: function(data,url) {
$(data).find("a:contains(.jpg)").each(function(url) {
new Image().src = url + $(this).attr("href");
});
}
});
};
}, 1000);
};
можно увидеть мою (неудачную) попытку передать url-адрес в .each() вызов - url в конечном итоге принимает значение увеличения целых чисел. Не уверен, почему или к чему они относятся, может быть, количество jpg файлы?
...в любом случае, он должен, конечно, принимать одно значение в моем исходном массиве URL-адресов.
Спасибо за любую помощь - я всегда, кажется, получить в немного поворот с этими обратными вызовами.
прогресс?
Итак, я немного повозился, обратив внимание на комментарии от @ron tornambe и @PiSquared и в настоящее время здесь:
//preloader for images on gallery pages
window.onload = function() {
var urls = ["./img/party/","./img/wedding/","./img/wedding/tree/"];
setTimeout(function() {
for ( var i = 0; i < urls.length; i++ ) {
$.ajax({
url: urls[i],
success: function(data) {
image_link(data,i);
function image_link(data, i) {
$(data).find("a:contains(.jpg)").each(function(){
console.log(i);
new Image().src = urls[i] + $(this).attr("href");
});
}
}
});
};
}, 1000);
};
я попробовал поставить image_link(data, i) здесь там и везде (в каждой вложенной функция etc.) но я получаю тот же результат: значение i только когда-либо зарегистрированным в качестве 3. Я подозреваю, что это потому, что все ссылки на i укажите на то же самое, и к тому времени асинхронная задача фактически доберется до image_link(data, i) the for... цикл закончен (и, следовательно, имеет значение 3). Излишне говорить, что это дает urls[i] как 'не определено'.
любой (больше) советы, как я могу обойти это?
7 ответов:
поскольку объект settings привязан к этому вызову ajax, вы можете просто добавить индексатор в качестве пользовательского свойства, к которому затем можно получить доступ с помощью
thisв успех обратного вызова://preloader for images on gallery pages window.onload = function() { var urls = ["./img/party/","./img/wedding/","./img/wedding/tree/"]; setTimeout(function() { for ( var i = 0; i < urls.length; i++ ) { $.ajax({ url: urls[i], indexValue: i, success: function(data) { image_link(data , this.indexValue); function image_link(data, i) { $(data).find("a:contains(.jpg)").each(function(){ console.log(i); new Image().src = urls[i] + $(this).attr("href"); }); } } }); }; }, 1000); };Edit: добавление в обновленный пример JSFiddle, поскольку они, похоже, изменили способ работы своих конечных точек ECHO:https://jsfiddle.net/djujx97n/26/.
чтобы понять, как это работает, см. поле "контекст" на объекте ajaxSettings: http://api.jquery.com/jquery.ajax/, конкретно это примечание:
" The
thisссылка во всех обратных вызовах-это объект в контексте, переданный в $.ajax в настройках; если контекста нет указано, что это ссылка на сами настройки Ajax."
попробуйте что-то вроде этого (используйте это.url, чтобы получить url):
$.ajax({ url: 'http://www.example.org', data: {'a':1,'b':2,'c':3}, dataType: 'xml', complete : function(){ alert(this.url) }, success: function(xml){ } });принято от здесь
вы не можете передать такие параметры - объект success сопоставляется с анонимной функцией с одним параметром, и это полученные данные. Создайте функцию вне цикла for, которая принимает
(data, i)в качестве параметров и выполнения есть код:function image_link(data, i) { $(data).find("a:contains(.jpg)").each(function(){ new Image().src = url[i] + $(this).attr("href"); } } ... success: function(data){ image_link(data, i) }
вы также можете использовать indexValue атрибут для передачи нескольких параметров через объект:
var someData = "hello"; jQuery.ajax({ url: "http://maps.google.com/maps/api/js?v=3", indexValue: {param1:someData, param2:"Other data 2", param3: "Other data 3"}, dataType: "script" }).done(function() { console.log(this.indexValue.param1); console.log(this.indexValue.param2); console.log(this.indexValue.param3); });
Я делаю это так:
function f(data,d){ console.log(d); console.log(data); } $.ajax({ url:u, success:function(data){ f(data,d); } });
просто чтобы поделиться аналогичной проблемой, которую я имел в случае, если это может помочь кому-то, я использовал:
var NextSlidePage = $("bottomcontent" + Slide + ".html");чтобы сделать переменную для функции нагрузки, но я должен был использовать:
var NextSlidePage = "bottomcontent" + Slide + ".html";без
$( )не знаю почему, но теперь он работает! Спасибо, наконец-то я увидел, что пошло не так с этого поста!
недавно я столкнулся с этой проблемой. Проблема приходит, когда длина имени файла больше, чем 20 символов. Таким образом, обход должен изменить длину вашего имени файла, но трюк также хорош.
$.ajaxSetup({async: false}); // passage en mode synchrone $.ajax({ url: pathpays, success: function(data) { //debug(data); $(data).find("a:contains(.png),a:contains(.jpg)").each(function() { var image = $(this).attr("href"); // will loop through debug("Found a file: " + image); text += '<img class="arrondie" src="' + pathpays + image + '" />'; }); text = text + '</div>'; //debug(text); } });после дополнительного расследования проблема исходит от запроса ajax: Обратите внимание на html-код, возвращенный ajax:
<a href="Paris-Palais-de-la-cite%20-%20Copie.jpg">Paris-Palais-de-la-c..></a> </td> <td align="right">2015-09-05 09:50 </td> <td align="right">4.3K</td> <td> </td> </tr>как вы можете видеть, имя файла разбивается после символа 20, поэтому
$(data).find("a:contains(.png))не может найти правильный расширение.но если вы установите значение
Comments