Вземете списък с всички входни обекти с помощта на JavaScript, без достъп до обект на формуляр

Трябва да получа всички input обекти и да манипулирам параметъра onclick.

Следното върши работата за <a> връзки. Търсите нещо подобно за input тагове.

for (var ls = document.links, numLinks = ls.length, i=0; i<numLinks; i++){
  var link = unescape(ls[i].href);
  link = link.replace(/\\'/ig,"#");
  if(ls[i].href.indexOf("javascript:") == -1)
  {
    ls[i].href = "javascript:LoadExtern(\\""+link+"\\",\\"ControlPanelContent\\",true,true);";
  }
}

person Jeremy Gwa    schedule 06.02.2010    source източник
comment
Ох, това е грозно и има няколко проблема за бягство. Никога не искате да използвате javascript URL адреси. Моето предложение за този конкретен код: оставете href където е и вместо това просто задайте ls[i].onclick= function() { LoadExtern(this.href, 'ControlPanelContent', true, true); };.   -  person bobince    schedule 06.02.2010


Отговори (2)


(Вижте актуализацията в края на отговора.)

Можете да получите NodeList от всичките input елементи чрез getElementsByTagName (DOM спецификация, MDC, MSDN), след което просто преминете през него:

var inputs, index;

inputs = document.getElementsByTagName('input');
for (index = 0; index < inputs.length; ++index) {
    // deal with inputs[index] element.
}

Там го използвах на document, който ще търси в целия документ. Съществува и върху отделни елементи (DOM спецификация), което ви позволява да търсите само в техните наследници, а не в целия документ, напр.:

var container, inputs, index;

// Get the container element
container = document.getElementById('container');

// Find its child `input` elements
inputs = container.getElementsByTagName('input');
for (index = 0; index < inputs.length; ++index) {
    // deal with inputs[index] element.
}

...но казахте, че не искате да използвате родителския form, така че първият пример е по-приложим към вашия въпрос (вторият е само за пълнота, в случай че някой друг, който намери този отговор, трябва да знае).


Актуализация: getElementsByTagName е абсолютно добър начин да направите горното, но какво ще стане, ако искате да направите нещо малко по-сложно, като просто да намерите всички квадратчета за отметка вместо всички input елементи?

Ето къде се появява полезното querySelectorAll: Позволява ни да получим списък с елементи, които съответстват на всеки CSS селектор, който искаме. И така, за нашия пример с квадратчета за отметка:

var checkboxes = document.querySelectorAll("input[type=checkbox]");

Можете също да го използвате на ниво елемент. Например, ако имаме div елемент в нашата element променлива, можем да намерим всички span с класа foo, които са вътре в този div по следния начин:

var fooSpans = element.querySelectorAll("span.foo");

querySelectorAll и братовчед му querySelector (който просто намира първия съответстващ елемент, вместо да ви даде списък) се поддържат от всички съвременни браузъри, а също и от IE8.

person T.J. Crowder    schedule 06.02.2010
comment
защо използвахте ++index? Елементите в NodeList започват с 0..така че по този начин пропускате първия елемент?? - person Alko; 31.12.2014
comment
@Alko: Аз не пропускам първото. Първата стойност на index в рамките на цикъла е 0. ++index не се случва до след първата итерация на цикъла. - person T.J. Crowder; 31.12.2014
comment
Това ще получи ли вложени елементи? Например, ако имам формуляр и след това вътре в този формуляр има таблица и вътре в тази таблица има ред и вътре в този ред има вход - това наистина ли ще получи този вход? Мисля, че може да работи само за входове от най-високо ниво. Трябва да получа ВСИЧКИ входове, вложени или не вложени. Вероятно има нужда от рекурсия - person MobileMon; 12.11.2020
comment
@MobileMon - Да, работи за елементи, които не са дъщерни потомци. Не знам за DOM метод, който намира елементи, които всъщност разглеждат само дъщерни елементи. (Само DOM колекции, като children и childNodes.). - person T.J. Crowder; 12.11.2020

querySelectorAll връща NodeList който има свой собствен forEach метод:

document.querySelectorAll('input').forEach( input => {
  // ...
});

getElementsByTagName вече връща HTMLCollection вместо NodeList. Така че първо трябва да го конвертирате в масив за да имате достъп до методи като карта и заВсеки:

Array.from(document.getElementsByTagName('input')).forEach( input => {
  // ...
});
person JSON C11    schedule 28.08.2019