2016-10-15 5 views
1

Я хочу, чтобы все элементы, которые имеющие идентификатор и хочет сохранить это значение ID в массиве, и я использую следующий метод:Получить идентификаторы всех элементов в массиве

var allTheElementsHavingID = document.querySelectorAll('[id]'); 
var allTheID = []; 
for(i=0;i<allTheElementsHavingID.length;i++) 
{ 
    allTheID.push(allTheElementsHavingID[i].id); 
} 

Но проблема здесь в том, что у меня около 15000 элементов с идентификатором. , и когда я запускаю код в консоли, он замораживает браузер. , так что я хочу альтернативу цикла for здесь, чтобы сохранить все ID Есть ли какой-либо другой метод?, который окажется более эффективным

+0

Почему, собственно, вы хотите, чтобы хранить все идентификаторы в массиве? –

+0

@RaxWeber Я проверяю, что идентификатор, указанный в назначении метки привязки (href), существует или нет. –

+0

@ RaxWeber Если вы знаете способ сделать это, пожалуйста, предложите это. Благодарю. –

ответ

0

Попробуйте это. он изменит цикл для выполнения асинхронно, так что он может занять столько времени, сколько потребуется для обработки элементов и не приведет к сбою браузера.

const els = document.querySelectorAll('[id]') 
 

 
function asyncLoop(els, callback) { 
 
    let ii = 0 
 
    const ret = [] 
 
    const length = els.length 
 
    
 
    function iter() { 
 
    const id = els[ii].id 
 
    const link = document.querySelector(`a[href*=${id}]`) 
 
    if (!link) { 
 
     ret.push(els[ii].id) 
 
    } 
 
    if (++ii < length) { 
 
     return setTimeout(iter, 0) 
 
    } 
 
    callback(ret) 
 
    } 
 
    iter() 
 
} 
 

 
asyncLoop(els, function(missingIds){ 
 
    console.log(missingIds) 
 
})
<a id="one" href="#one">one</a> 
 
<a id="two" href="#two">two</a> 
 
<a id="fail" href="#three">three</a>

Я не уверен, что получение и перебор списка с 15000 элементами является хорошей идеей. Вы можете оценить 'hashchange', чтобы увидеть, есть ли соответствующий элемент при нажатии ссылки. Это даст вам возможность справиться с любыми ошибками.

!!element возвращение позволит предотвратить действия, если нет соответствия элемент

window.addEventListener('hashchange', function(e) { 
 
    var element = document.querySelector(location.hash) 
 
    console.log(element) 
 
    return !!element 
 
})
<a id="one" href="#one">one</a> 
 
<a id="two" href="#two">two</a> 
 
<a id="fail" href="#three">three</a>

+0

Спасибо, что это хорошо, есть способ, которым я могу знать, есть ли соответствующий элемент, не нажимая ссылку ??? –

+0

Не с этим решением. почему у вас такой большой список и так много идентификаторов на странице? и есть ли меньше ссылок с hrefs, чем id? – synthet1c

+0

Требование состоит в том, чтобы опубликовать книгу в формате html и на странице книги нет. 1237 каждая страница состоит из чего-то, что должно быть связано. –

-1

Вы можете дать им все элементы одного класса, а затем получить идентификаторы всех элементов с тем же классом. Вот jsfiddle https://jsfiddle.net/qdk9d55w/4/

var elementIds = []; 
var elements = document.getElementsByClassName("example"); 
for (var i = 0, len = elements.length; i < len; i++) { 
    if (elements[i].id != '') { 
     elementIds.push(elements[i].id); 
    } 
} 
alert(elementIds); 
+0

Нет, они не такие же. –

+0

https://jsfiddle.net/qdk9d55w/ просто дать всем этим элементам один и тот же класс, независимо от того, являются ли элементы разными. –

+0

Спасибо, Alex, но даже если я добавлю имя класса ко всем элементам, проблема все еще существует, потому что document.getElementsByClassName вернет элементы с тем же именем класса, что и их «ID» –

0

Основная проблема заключается в том, что цикл над так много деталей всегда собирается занять некоторое время. Но, возможно, использование встроенной функции, такой как .map(), будет быстрее, чем ваш собственный цикл.

var allTheID = [].map.call(allTheElementsHavingID, e => e.id); 

Но, видимо, я ошибаюсь.

JQuery map vs Javascript map vs For-loop

+0

Я думал, что внутренние циклы были быстрее, чем методы Array. – synthet1c

+0

Вы правы, я нашел несколько других вопросов, которые касаются этого. – Barmar

+0

Я думаю, что вы все равно должны использовать методы Array, поскольку их легче понять, и это дает разработчикам браузера возможность оптимизировать свой код за кулисами. Однако 15 000 итераций - это честный бит. – synthet1c

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