Поиск атрибута в JavaScript - PullRequest
       23

Поиск атрибута в JavaScript

0 голосов
/ 11 сентября 2009

Без использования какой-либо инфраструктуры с открытым исходным кодом (jQuery и т. Д.) :), в JavaScript, что является наиболее эффективным способом поиска атрибутов в любых элементах управления. (Любые старые / новые браузеры)

Это образец, которому я следую. Есть ли лучший способ или лучший метод getElementByAttribute()? Спасибо!

* 1006 например *

<input type="button" id="b1" value="Continue" a1="something" />
<input type="text" id="t1"  a1="something1" />

<script>
var attrToFind = "something;something1";

var elems = document.all ? document.all : document.getElementByTagName("*");
//assume elems work always
for(var i = 0 ; i < elems.length; i++)
{
  var att = elems[i].getAttribute("a1");
  if (typeof att == "string")
  {
    if (att.indexOf(attrToFind) > -1)
    ... //search which attr you find, create array, save value, etc.
  }
}
</script>

Ответы [ 3 ]

1 голос
/ 11 сентября 2009

Доступ к HTMLCollection (возвращаемому функциями getElement[s]By*) медленный по сравнению с доступом к массивам, поскольку HTMLCollection должен соответствовать документу всегда (это live ).

По этой причине лучше создать массив из HTMLCollection и выполнить итерацию по нему.

Это немного более оптимизировано для скорости:

var attrToFind = "something;something1",
    elems = document.all ? document.all : document.getElementByTagName('*'),
    i, attr;

// Works in Firefox; not sure about other browsers and engines.
elems = Array.prototype.slice.call(elems);

i = elems.length;

while(i --> 0) {
    attr = elems[i].getAttribute('a1');

    // Are you sure you want indexOf?
    // att === attrToFind may be faster, as it requires one less comparison.
    if(typeof att !== 'string' || att.indexOf(attrToFind) < 0) {
        continue;
    }

    // Do stuff.
}
1 голос
/ 11 сентября 2009

Есть. Учитывая, что браузер поддерживает другие средства для сбора элементов, такие как document.querySelectorAll (выражение css) или document.evaluate (выражение xpath), эти «специализированные» методы обычно более эффективны.

document.querySelectorAll('*[foo="bar"]');
document.evaluate("//*[@foo='bar']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
0 голосов
/ 23 апреля 2012

Возможно, вам понадобится такое решение:

function $$$$(obj) {

var attrToFind = obj;
var elements = document.getElementsByTagName('*');
var attrResults = [];

var x = 0;
while (x < elements.length) {
    var attr = elements[x].getAttribute('a1');

    if (attr !== null) {
        if (attr.indexOf(attrToFind) > -1) {
            attrResults.push(elements[x]);
        }
    }
    x++
}
return attrResults;

}

Функция запуска:

$$$$('something');

Результатом является Массив со всеми элементами класса «что-то». Может быть, кто-то может реорганизовать мой код, чтобы он работал с более чем одним параметром.

Я надеюсь, что смогу вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...