document.getElementsByTagName ("a") пропускает ссылку - PullRequest
3 голосов
/ 02 ноября 2011

Я работал над сценарием для Greasemonkey (FX7), пытающимся удалить определенные ссылки, и обнаружил, что по какой-то причине та, которая была в источнике, а не скрыта или сконструирована JS, не появилась в массиве, который эта функция возвращает.

Если бы он был создан с помощью JS при запуске этой страницы, меня это не удивит, но он находится прямо за другой найденной ссылкой.

Так кто-нибудь знает, почему это происходит и как я могу обойти это?

var links = document.getElementsByTagName("a");
for (var l in links){
  if (links[l].href == "blah"){ ... }
}

Вот как я пытался работать с ними, немного урезанный, так как у меня было еще несколько проверок, чтобы не столкнуться с пустыми значениями и тому подобное.

О sidenote: мне было интересно, почему эта функция вообще возвращает нулевые записи.

Редактировать: Я прошел эту проблему давно, так как я обратился за помощью и нашел хороший способ сделать это:

for (var i = 0, l; l = links[i]; i++) { }

Устанавливает l для текущей ссылки, пока не останется ни одной. Работает хорошо.

Ответы [ 4 ]

7 голосов
/ 02 ноября 2011

Оператор for ... in просматривает свойства объекта.В этом конкретном случае вы перебираете свойства объекта Array.Попробуйте использовать этот скрипт вместо:

var links = document.getElementsByTagName("a");
for (var l = 0; l < links.length; l++){
  if (links[l].href == "blah"){ ... }
}
0 голосов
/ 06 мая 2019

getElementsByTagName ("area") [0] возвращает значение его атрибута href, а не HTMLAnchorElement

0 голосов
/ 07 октября 2018
var links = document.getElementsByTagName('a');
  for (var i=0; i<links.length; i++){
     if (links[i].href.match('blah')){...}
  };
0 голосов
/ 02 ноября 2011

for … in операторы перебирают свойства объекта, а не только его значения, как сказал @Yuriy. Вам нужно изучить Javascript, чтобы понять это (извините, не смог найти прямой указатель на эту часть после нескольких минут поиска в Google).

По сути, вы должны понимать, что объекты в JS также включают «методы». Когда вы используете цикл for … in, вы найдете значения объекта, а также его «методы» и другие свойства.

Итак, либо используйте индексированный цикл @ Yuriy ... или, что еще лучше, используйте метод hasOwnProperty() ( MDN doc ), который позволяет избежать очень важного предостережения, упомянутого @Kolink.

Ваш цикл должен выглядеть так:

var links = document.getElementsByTagName('a');
for (var l in links) {
    if (! links.hasOwnProperty(l))
        continue; // this goes straight to the next property

    if (links[l].href == "blah") { ... }
}
...