#javascript #jquery
#javascript #jquery
Вопрос:
Я создал простой код для загрузки изображений с помощью Ajax и использовал FileReader для предварительного просмотра содержимого перед загрузкой..
Изображение будет предварительно просмотрено на основе действия прокрутки, чтобы сократить время загрузки..
Но проблема в том, что когда я запускаю событие прокрутки, будет запущен код ошибки.. «Ошибка типа: аргумент 1 FileReader.readAsDataURL не является объектом».
$('.loaded-images-content').scroll(function () {
$('[drawed=None]').each(function () {
var bottom_of_object = $(this).offset().top $(this).outerHeight();
var bottom_of_window = $('.loaded-images-content').scrollTop() $('.loaded-images-content').height();
if (bottom_of_window > bottom_of_object) {
var index = $(this).parent().parent().parent().attr('index');
$(this).attr('drawed', 'yes');
Draw_Image(index);
}
});
});
function Draw_Image(index) {
var reader = new FileReader();
reader.onload = function (e) {
var tmpimage = new Image();
tmpimage.src = reader.result;
tmpimage.onload = function () {
var MAX_WIDTH = 120;
var MAX_HEIGHT = 140;
var tmp_w = tmpimage.width;
var tmp_h = tmpimage.height;
if (tmp_w > tmp_h) {
if (tmp_w > MAX_WIDTH) {
tmp_h *= MAX_WIDTH / tmp_w;
tmp_w = MAX_WIDTH;
}
}
else {
if (tmp_h > MAX_HEIGHT) {
tmp_w *= MAX_HEIGHT / tmp_h;
tmp_h = MAX_HEIGHT;
}
}
var canvas = document.createElement("canvas");
canvas.width = tmp_w;
canvas.height = tmp_h;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0, tmp_w, tmp_h);
$('#loaded-image-frame' index ' #preview').html(canvas);
}
}
reader.readAsDataURL(filesList[index]);
}
Комментарии:
1. Что такое
filesList
? Кроме того, вам, вероятно, не нуженFileReader
canvas
, вы можете просто использовать<img>
с егоsrc
значениемURL.createObjectURL(yourFile)
, которое будет URI большого двоичного объекта , иURL.revokeObjectURL(yourBlobURI)
когда вам это больше не нужно, и поскольку кажется, что изображения поступают с пользовательского ввода, вы можете опустить время загрузки (и, следовательно, вашу прокрутку), оно будет состоять только из времени рендеринга, выборки нет.2. Список файлов — это массив, содержащий файлы из <input> file.. В прошлом я использовал <img> с его src, но страница сайта была очень плохой во время прокрутки из-за размера изображений, поэтому я попытался использовать canvas !!
3. С точки зрения CSS, Canvas repaint точно такой же, как в img, поэтому вам действительно не нужен canvas, вы можете сохранить прокрутку, просто изменив отображение ваших изображений. И
filesList
это массив, который вы создали, или тот, изinput.files
которого?4. Список файлов — это созданный мной массив, но как насчет производительности страницы при предварительном просмотре некоторого изображения с исходным размером. как насчет ошибки «TypeError: аргумент 1 FileReader.readAsDataURL не является объектом».
5. Если вы правильно настроили изображения
width
иheight
, все должно быть в порядке. Ваша ошибка означает, чтоfilesList
не содержит файла по индексу, к которому вы пытаетесь получить доступ (может быть провереноconsole.log(filesList[index])
перед вызовомreadAsDataURL()
.)
Ответ №1:
Ваша ошибка означает, что в списке файлов нет файла с индексом, к которому вы пытаетесь получить доступ
Правильно, спасибо..