Как добавить размеры к динамическим элементам img

Я использую вызов Json для получения списка адресов изображений, а затем добавляю их по отдельности в такой div. К сожалению, размер изображения не является частью информации Json.

<div id="container">
   <img src="A.jpg" alt="" />
   <img src="B.jpg" alt="" />
   ...
</div>

Знали ли вы, гении JQuery, код, который безупречно и динамически добавлял бы истинные Width и Height к каждому img элементу в контейнере сразу после визуализации каждого отдельного элемента?

Я подумал, может быть, код может сделать проверку ширины изображения width > 0, чтобы оценить, когда изображение действительно было отрисовано, а затем запустить. Но я бы не знал, как это сделать и заставить работать стабильно. Как лучше всего это сделать?

Обновить. Как указано в ответах, добавление элементов Width или Height к элементам - обычное дело. Проблема здесь в том, чтобы написать код, который будет знать когда это делать. И оцените это условие для каждого изображения, а не для страницы в целом.

Обновление 2
Я нашел очень хороший рабочий ответ здесь


person Mohammad    schedule 23.04.2010    source источник
comment
Тупой вопрос: зачем вам устанавливать атрибуты ширины и высоты?   -  person RoToRa    schedule 23.04.2010
comment
ага, почему? ... вам не нужно .. потому что, если вам нужны размеры позже, вы можете .width() или .height() это ... я потерялся здесь?   -  person Reigel    schedule 23.04.2010
comment
@RoToRa: Мне это нужно, так как после этого я выполню некоторые манипуляции с DOM над изображениями, которые требуют знаний о высоте и ширине изображения. @Reigel, да, конечно, и все нижеприведенные ответы указывают на это, но вопрос не об этом.   -  person Mohammad    schedule 23.04.2010
comment
Только что нашел это решение: stackoverflow.com/questions / 2392410 /   -  person balu    schedule 23.04.2010
comment
@codethief: это, вероятно, ответит на мой вопрос .. Я изучаю это, спасибо !!   -  person Mohammad    schedule 23.04.2010


Ответы (5)


Да, вы можете, вы можете использовать методы width() и height() для получения размеров изображений. Спасибо JQuery.

Больше информации:

Обновить комментарий без ошибок:

load даже запускается, когда все изображения и внешние ресурсы загружены на страницу вместе с DOM, поэтому вы можете использовать это и использовать методы width() и height() для получения размеров изображений. Пример:

$(window).load(function(){
  // your code to get dimensions, manipulate images, etc
})
person Sarfraz    schedule 23.04.2010
comment
вам нужно будет дождаться завершения загрузки изображений, прежде чем эта информация станет верной. - person Rik Heywood; 23.04.2010
comment
Верно, именно об этом и идет речь, как узнать, когда изображения загружены, и сразу после этого запускается код. Но я ищу самый надежный способ сделать это. :) - person Mohammad; 23.04.2010
comment
Спасибо, можем ли мы добавить такую ​​же функциональность к отдельным элементам ‹img› после обновления dom, чтобы функция запускалась индивидуально, ‹img› несколько раз, а не один раз и для всех? - person Mohammad; 23.04.2010
comment
@Mohammad: вы можете поместить любой код в событие загрузки при работе с изображениями. - person Sarfraz; 23.04.2010

попробуй это:

$('#container img').css('height', function(index, value){
    return $(this).height()+ 'px';
})
$('#container img').css('width', function(index, value){
    return $(this).width() + 'px';
})

ИЗМЕНЕНО

хорошо, я пробовал что-то подобное, и когда я проверяю элементы с помощью firebug, атрибуты высоты и ширины имеют правильные значения ....

$(document).ready(function(){

  $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
        function(data){
          $.each(data.items, function(i,item){
            $("<img/>").attr("src", item.media.m).appendTo("body");
            if ( i == 999 ) return false;
          });
          $('img').css('height', function(index, value){
              return $(this).height()+ 'px';
          });
          $('img').css('width', function(index, value){
              return $(this).width()+ 'px';
          });
  });
})

демонстрация

person Reigel    schedule 23.04.2010
comment
Но не будет ли это казаться слишком рано? Подобно тому, как изображения загружаются на страницу (их довольно много), разве это не будет работать только с изображениями, которые уже кэшированы и визуализированы? - person Mohammad; 23.04.2010
comment
Я вижу, что вы используете вызов ajax, поэтому просто вызовите эти строки кода в обратном вызове ... часть после того, как ваш код добавил все изображения ... - person Reigel; 23.04.2010
comment
Верно, но мне нужно, чтобы он запускался для каждого отдельного изображения после его рендеринга. Не тогда, когда DOM был обновлен новыми элементами img. Если этот код сработает слишком рано, он не сможет найти размеры изображения, поскольку изображение еще не существует. Допустим, для 100 изображений были обработаны только первые 20. Остальные 80 будут иметь размеры 0 x 0 с этим кодом, верно? - person Mohammad; 23.04.2010
comment
Рейгель: Но вы все еще ждете, пока все изображения будут загружены, не так ли? - person balu; 23.04.2010
comment
@codethief: Нет, на самом деле код не ждет загрузки изображений. @Reigel: Код сработал у меня в первый раз, когда я его использовал, но во второй и третий раз я получил следующее: 27.media.tumblr.com/tumblr_l1bt1rdUIp1qzee9jo1_500.png Я не понимаю, почему это сработало в первый раз, поскольку теоретически он всегда должен возвращать значение высоты и ширины элемента при срабатывании кода, и я предполагаю это так же, как изображения запрашиваются http. Таким образом возвращаются все нули. Спасибо за все ваши усилия, я очень признателен. - person Mohammad; 23.04.2010

Используйте $ (document) .ready (), чтобы дождаться полной загрузки изображений.

готов (обработчик)

обработчик - функция, выполняемая после того, как DOM будет готов.

Хотя JavaScript предоставляет событие загрузки для выполнения кода при визуализации страницы, это событие не запускается, пока все ресурсы, такие как изображения, не будут полностью получены.

Решение Рейгеля, теперь с использованием $ (document) .ready ():

$(document).ready(function() {
    $('#container img').css('height', function(index, value){
        return $(this).height()+ 'px';
    });
    $('#container img').css('width', function(index, value){
        return $(this).width() + 'px';
    });
});

[РЕДАКТИРОВАТЬ]: Я только что понял, что это может не сработать, когда вы вставляете изображения после загрузки страницы, но я думаю, что стоит попробовать:

$('#mydiv').html('<img .../><script language="javascript" type="text/javascript">$(document).ready(...)</script>');
person balu    schedule 23.04.2010
comment
Спасибо, но, как упоминается в вопросе, это должно быть динамическое событие, которое проверяет состояние рендеринга для каждого изображения и запускается для каждого изображения сразу после его рендеринга. Не когда все загрузилось. - person Mohammad; 23.04.2010
comment
@ Edit Это тоже не сработает, так как приведет к возникновению состояния гонки. Рабочий код должен знать состояние каждого отдельного изображения и запускаться индивидуально для каждого из них. Но спасибо! - person Mohammad; 23.04.2010

$('#container img').each(function(){
var pic_real_width;
var pic_real_height;

$(img).load(function() {
    // Remove attributes in case img-element has set width and height
    $(this).removeAttr("width")
           .removeAttr("height")
           .css({ width: "", height: "" }); // Remove css dimensions as well

    pic_real_width = this.width;
    pic_real_height = this.height;
});

var src = img.src;
img.src = "";
img.src = src; // Triggers onload if image is cached
});

Благодарим Xavi

person Mohammad    schedule 30.05.2010

Другое предложение:

Загрузите изображения через AJAX в фоновом режиме и надейтесь, что браузер кэширует их, чтобы они были мгновенно там, когда вы добавляете элементы в свой div (и вы можете сразу же получить width () и height ()). ;)

Если у вас есть доступ к веб-серверу, который отправляет эти изображения: Убедитесь, что вы установили соответствующие заголовки кеша.

[EDIT]: вместо того, чтобы полагаться на кеш, вы также можете поместить данные изображения, который вы только что загрузили через AJAX прямо в исходный код. К сожалению, в IE это явно не работает.

<img src="data:<mimetype>;base64,<data>" />

Для кодирования данных используйте функцию, подобную этой.

person balu    schedule 23.04.2010
comment
У меня вообще нет доступа к веб-серверу, но расчет на включение кеша на стороне браузера может быть контрпродуктивным. Я все еще думаю, что должен быть способ сделать это, проверив ширину элемента img. - person Mohammad; 23.04.2010
comment
@codethief в следующий раз, просто отредактируйте свой ответ, если у вас есть другие предложения ... не используйте более одного ... спасибо! - person Reigel; 23.04.2010
comment
@Reigel: И поэтому вы проголосовали против? Не говоря уже о том, что это совершенно другой подход, поэтому он заслуживает отдельного упоминания. - person balu; 23.04.2010
comment
да ... со мной тоже случилось в первый раз, когда я был здесь ... :) - person Reigel; 23.04.2010
comment
@Reigel Во-первых, я здесь не первый раз. Кроме того, это другой, отдельный подход. См. meta.stackexchange.com/questions/25209/ - person balu; 23.04.2010