Canvas и jQuery
Есть скрипт который делает ресайз изображения через canvas:
$('#image').change(function(){ var files = $(this)[0].files; for(var i = 0; i < files.length; i++){ var file = $(this)[0].files[i]; var fileURL = getBlobURL(file); $("#canvasList").append('<canvas id="canvas'+i+'" width="0" height="0"></canvas>') var canvas = $("#canvas"+i+"")[0]; var context = canvas.getContext("2d"); var img = new Image(); img.src = fileURL; console.log(img); img.onload = function(){ var width = img.width; var height = img.height; if(height>width){ heightRe = 1080; widthRe = (heightRe*width)/height; } else{ widthRe = 1920; heightRe = (height*widthRe)/width; } canvas.width = widthRe; canvas.height = heightRe; context.drawImage(img,0,0,widthRe,heightRe); }; } Выводится Только последнее изображение, все остальные canvas'ы имеют высоту и ширину 0. Почему так? |
Потому что в js когда ты пишешь
for (..) { var canvas = ..; } на самом деле получается var canvas; for (..) { canvas = ..; } То есть у тебя не создается на каждой итерации новая переменная canvas, понимаешь? У тебя всего одна переменная, и именно последнее присвоенное значение в ней и остается. А функция img.onload ссылается именно на нее. Тоже самое и с переменной img и context Переменные в js через var объявляются на уровне функции, а не блока. Эту проблему в будущем решит let. Ну а пока нужно использовать замыкания или любой другой способ, главное чтобы для каждого img.onload была своя переменная canvas. Кстати, почему нельзя сразу отображать <img> и ресайзить его. Какую роль играет canvas? |
В дальнейшем, есть кнопочка сохранить, которая отправляет изображение на сервер (измененное). Т.е. получается ресайз на стороне клиента!
|
То есть в других языках цикл порождает блок, в котором можно объявлять переменные. В JS переменная объявляется не на уровне блока, а на уровне функции. То есть тебе нужно обернуть в функцию твой код, использующий переменные, чтобы создать "блок для переменных" (замыкание)
|
а если в функции img.onload удалять переменную?
|
Т.е. я создаю функцию с этой всей белибердой которая в конце вызывает сама себя, здесь ее вызываю
$('#image').change(function(){ ...... }); А как прекратить это? |
Цитата:
Лучше всего вынести все в функцию: function createCanvas(src) { var canvas = $('<canvas/>', {width: 0, height: 0}).get(0); var context = canvas.getContext("2d"); var image = new Image(); image.onload = function(){ var width = image.width; var height = image.height; if (height > width){ heightRe = 1080; widthRe = (heightRe*width) / height; } else { widthRe = 1920; heightRe = (height*widthRe) / width; } canvas.width = widthRe; canvas.height = heightRe; context.drawImage(image, 0, 0, widthRe, heightRe); }; image.src = src; return canvas; } $('#image').change(function(){ var files = this.files; for (var i = 0; i < files.length; i++){ var fileURL = getBlobURL(files[i]); var canvas = createCanvas(fileURL); $("#canvasList").append(canvas); } }); Цитата:
А почему не так тогда уж: $($($(this)[0])[0])[0] - так посолидней смотрится ведь, правда? |
Тут от jQuery рожки да ножки остались. Если это - все ради чего подключена была библиотека - можно и остатки выпилить.
|
Часовой пояс GMT +3, время: 12:53. |