Загрузите изображение через jQuery Ajax
Я создаю приложение, которое просматривает большое количество фотографий. На этом этапе эта часть проекта завершена, и она сортирует, фильтрует и загружает правильные изображения и даже разбивает их на отдельные страницы для более быстрой загрузки.
Это прекрасно работает, но загрузка 25 картинок на страницу все равно занимает более 8 секунд. Я провел некоторое исследование и пришел к выводу, что использование асинхронных запросов jQuery Ajax было бы наилучшим, чтобы загрузить их все одновременно и максимально быстро.
Вот мой код для этого до сих пор:
var imageArray = <?php if (!empty($images)) {echo '["' . implode('", "', $images) . '"]';} else {echo "false";} ?>;
console.log(imageArray);
console.log(imageArray.length);
for (i = 0; i < imageArray.length; i++) {
$.ajax({
type: 'GET',
url: imageArray[i],
dataType: 'image/jpg',
async: true,
success: function (data) {
$("#" + i).attr("src", data);
}
});
}
Проблема этого кода в том, что он не загружает ничего, кроме пустого белого квадрата с серой рамкой. Когда я изменяю код и запускаю его в консоли в Chrome, data
в итоге получается строка из перемешанных символов, которые, как я полагаю, являются необработанными данными изображения.
Я искал несколько дней, в том числе на SO, и мне еще предстоит найти решение, которое делает то, что мне нужно. Наоборот, я нашел решения, которые просто помещают URL в источник изображения, используя jQuery. attr()
что не то, что мне нужно.
Если кто-то может предложить какое-либо решение для исправления этого кода или даже, возможно, другой и более эффективный метод получения всех изображений, я открыт для всего.
imageArray: http://pastebin.com/03tvpNey
С уважением, Эмануэль
3 ответа
Если вы используете данные изображения Base64 (указанную вами строку из перемешанных символов), вам необходимо получить img src
быть чем-то вроде:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Итак, ваш код должен быть:
var imageArray = <?php if (!empty($images)) {echo '["' . implode('", "', $images) . '"]';} else {echo "false";} ?>;
console.log(imageArray);
console.log(imageArray.length);
for (i = 0; i < imageArray.length; i++) {
$.ajax({
type: 'GET',
url: imageArray[i],
dataType: 'image/jpg',
async: true,
success: function (data) {
$("#" + i).attr("src", 'data:image/png;base64,'+data);
}
});
}
Однако... Я был бы очень удивлен, если загрузка изображений через AJAX и использование содержимого Base64 происходит быстрее, чем использование обычного <img src="path"/>
подход.
Смысл AJAX заключается в получении некоторых данных после загрузки DOM. Все современные браузеры будут загружать изображения асинхронно. Я сомневаюсь, что вы увидите какой-либо прирост производительности.
Я бы предположил, что более вероятная проблема заключается в том, что ваши 25 изображений... которые, я полагаю, отображаются в виде миниатюр... по-прежнему большие изображения с высоким разрешением. Вам следует сохранить уменьшенную версию "миниатюры", а затем получить изображение высокого разрешения, когда / если пользователь нажимает на миниатюру, чтобы просмотреть полноразмерную версию.
Обратите внимание, что идентификатор элемента может начинаться с (или быть) цифрой. Это недопустимо в HTML4, но совершенно нормально в HTML5. Тем не менее, у вас могут возникнуть проблемы с правилами CSS, поэтому вам лучше использовать префикс с буквой (например, i1,i2,i3...).
Просто для обновления (май 2020 г.), поскольку я пытался получить изображения через ajax, но безуспешно, несмотря на использование подхода base64.
Вот код, который я изменил, который возвращает изображение в виде капли:
const trigger = $('.trigger');
const wrapper = $('#wrapper');
const url = 'https://66.media.tumblr.com/35a8d8dac5c288505b3edb4a52655283/ee225bfce5e62623-af/s1280x1920/fad4e25562ce1b05c69dc8cc8da5a9a12d26a1aa.jpg';
trigger.on('click', () => {
$.ajax({
url,
xhrFields:{
responseType: 'blob'
},
success (data) {
const url = window.URL || window.webkitURL;
const src = url.createObjectURL(data);
wrapper.attr('src', src);
}
});
});
Рабочий пример здесь: http://jsfiddle.net/lharby/Ljwa1yhd/
Я понимаю, что это немного отличается от запроса OP, но я нашел здесь свой способ поиска "получить изображения через ajax jquery", поэтому я надеюсь, что это поможет. И поскольку мне не удалось заставить работать метод base64, я подумал, что пример может быть полезен.
У меня была проблема с этим некоторое время назад, я использовал этот код:
function loadImage(path, width, height, target) {
var loaded = true;
$('<img src="' + path + '">').load(function () {
if (loaded) {
$(this).css('maxWidth', width).css('maxHeight', height).appendTo(target);
loaded = false;
}
});
}
ОБНОВИТЬ:
используя ваш массив изображений:
["20151107_140328.jpg", "20151107_140329.jpg", "20151107_141113.jpg", "20151107_141114.jpg", "20151107_141439.jpg", "20151107_141447.jpg", "20151107_141500.jpg", "20151107_205509.jpg", "20151107_205512.jpg", "20151107_213703.jpg", "20151107_213708.jpg", "20151107_213823.jpg", "20151108_143256.jpg", "20151108_143258.jpg", "20151108_143320.jpg", "20151108_143322.jpg", "20151108_143339.jpg", "20151108_143340.jpg", "20151108_143419.jpg", "20151108_143422.jpg", "20151108_143433.jpg", "20151108_143435.jpg", "20151108_143443.jpg", "20151108_143445.jpg"]
Вы можете сделать это:
var image_array = ["20151107_140328.jpg", "20151107_140329.jpg", "20151107_141113.jpg", "20151107_141114.jpg", "20151107_141439.jpg", "20151107_141447.jpg", "20151107_141500.jpg", "20151107_205509.jpg", "20151107_205512.jpg", "20151107_213703.jpg", "20151107_213708.jpg", "20151107_213823.jpg", "20151108_143256.jpg", "20151108_143258.jpg", "20151108_143320.jpg", "20151108_143322.jpg", "20151108_143339.jpg", "20151108_143340.jpg", "20151108_143419.jpg", "20151108_143422.jpg", "20151108_143433.jpg", "20151108_143435.jpg", "20151108_143443.jpg", "20151108_143445.jpg"];
for(var i = 0; i < image_array.length; i++) {
loadImage(image_array[i], <width>, <height>, <container targeted>);
}
и в функции imageLoad:
function loadImage(path, width, height, target) {
var loaded = true;
$('<img src="/path/to/image/' + path + '">').load(function () {
if (loaded) {
$(this).css('maxWidth', width).css('maxHeight', height).appendTo(target);
loaded = false;
}
});
}
Измените свои идентификаторы на id1,id2
или что-то похожее из 1,2
и в случае успеха используйте это:
$("#id" + i).attr("src", data);
Выясните, почему идентификатор не должен начинаться с цифры: каковы допустимые значения атрибута id в HTML?