hasAttribute -VS- getAttribute

303
26 сентября 2017, 08:47

Тут есть решённая задача - http://plnkr.co/edit/FaKoF0M4QQB1OSdtpClb?p=preview

Суть в том, чтобы сделать предзагрузку картинок по мере прокрутки страницы.

Функцию showVisible - сделал слегка по-своему:

function showVisible() {
  var imgs = document.getElementsByTagName("img");
  for (var i = 0; i < imgs.length; i++) {

    if (isVisible(imgs[i]) && imgs[i].hasAttribute("realsrc")) {   // <--
      imgs[i].src = imgs[i].getAttribute("realsrc");
      imgs[i].setAttribute("realsrc", "");
    }
  }
}

Проблема возникает в проверке:

 if (isVisible(imgs[i]) && imgs[i].hasAttribute("realsrc"))

а именно в методе hasAttribute - из-за него крашатся все картинки оказавшиеся в поле видимости. Проблему решает замена hasAttribute на getAttribute. Так и хочется сказать ё**ный кот, да как так то? Кто-то может объяснить почему возникает подобная дичь?

Answer 1

Метод hasAttribute в вашем случае вернет всегда значение true, вне зависимости от того, что у вас в аттрибуте, ведь согласно коду, аттрибут есть всегда, а вот значение не всегда у него есть.

А метод getAttribute в одном случае вернет вам адрес ссылки, а в другом случае вернет пустое значение. Что в нашем случае означает:

var tmp = imgs[i].getAttribute("realsrc"); // вернуло 'https://js.cx/lazyimg/3-2.jpg'

Значит при проверке !tmp - это false.

В противоположном случае у нас будет пустое значение, не undefined а просто ничего. Аттрибут есть, а значения нет.

var tmp = imgs[i].getAttribute("realsrc"); // вернуло '' - ничего нет

Значит при проверке !tmp - это true.

Поэтому вот так и получается, что условие всегда true - отсюда и беда.

READ ALSO
Зачем для application/x-www-form-urlencoded заменять &ldquo;%20&rdquo; на &ldquo;+&rdquo;?

Зачем для application/x-www-form-urlencoded заменять “%20” на “+”?

Для application/x-www-form-urlencoded пробелы должны быть заменены на "+", поэтому вам может понадобиться encodeURIComponent с дополнительной заменой "%20" на "+"

253
Длина элемента с классом hidden

Длина элемента с классом hidden

Столкнулся с непониманием того, какая высота у элементов с dislpay: none;

250
JavaScript, проблема с SetInterval

JavaScript, проблема с SetInterval

Подскажите, почему без if-а таймер работает нормально, а с ним - вообще не запускается?

300