2016-07-20 5 views
0

У меня есть эта функция для печати размеров изображения всех <img>, имеющих атрибут [proto].Почему эта функция работает неправильно

Когда я пытаюсь выполнить функцию с помощью этого метода each, он возвращает функцию.

Какая ошибка?

function size(){ 
    var $img = $('img[proto]'); 
    $($img).each(function(){ 
     var height = $(this).height; 
     var width = $(this).width; 
     $(this).parent().find('p').remove(); 
     $(this).parent().append('<p class="size">' + width + '-' + height + '</p>'); 

    }); 
} 
size(); 
+1

* «Единственное, что возвращает функцию» * - Можете ли вы объяснить, что вы имеете в виду? – nnnnnn

+2

изменить '$ ($ img)' на '$ img', так как это уже объект jquery, не нужно обертывать' $() ' – guradio

+1

^^ правильно, но стоит отметить, что он не остановит его работу. jQuery достаточно умен, чтобы определить это и «просто работать». – Archer

ответ

9

Эти функции не свойства, высота и ширина:

var height = $(this).height(); 
var width = $(this).width(); 
1
  1. Изменение вы элементы declartion. Потому что вы делаете это так: $($('img[proto]')). Таким образом, вы дважды добавляете свои элементы в jQuery.
  2. width и height - это функции, а не свойства. Поэтому вам нужно добавить скобки.

function size() { 
    $('img[proto]').each(function() { 
     var height = $(this).height(), 
      width = $(this).width(); 
     $(this).parent().find('p').remove(); 
     $(this).parent().append('<p class="size">' + width + '-' + height + '</p>'); 
    }); 
} 

size(); 

Я бы даже предпочел, чтобы получить только элементы, которые необходимы один раз. То, как вы это делали, вносит this четыре раза в объект jQuery и два раза ищет для родителя. Производительность может быть сохранена.

var element = $(this), 
    parent = element.parent(), 
    height = element.height(), 
    width = element.width(); 

parent.find('p').remove(); 
parent.append('<p class="size">' + width + '-' + height + '</p>'); 

И если вы хотите, чтобы выполнить функцию непосредственно, вы можете использовать IIFE или просто удалить функцию вокруг и выполнить его непосредственно.

(function() { 
    $('img[proto]').each(function() { 
     // ... 
    }); 
})(); 
+0

еще один вопрос: есть ли причина, по которой ваша версия не работает: $ (window) .resize (function() { size(); }); – Gregor

+0

Нет, это должно работать нормально. Вы даже можете записать его короче: '$ (window) .resize (size);'. Если у вас возникли проблемы, сообщите мне или покажите мне свой код. Тогда было бы что-то еще неправильно ... – eisbehr

+0

uuch. Я сделал глупую ошибку. Пора спать. жаль беспокоить вас и благодарить. – Gregor

Смежные вопросы