2010-10-02 3 views

ответ

2
var linkcheck = (function(){ 
    if(!Array.indexOf){ 
    Array.prototype.indexOf = function(obj){ 
    for(var i=0; i<this.length; i++){ 
    if(this[i]===obj){ 
     return i; 
    } 
    } 
     return -1; 
    } 
    } 
    var url_pages = [], anchor_nodes = []; // this is where you put the resulting urls 
    var anchors = document.links; // your anchor collection 
    var i = anchors.length; 
    while (i--){ 
    var a = anchors[i]; 
    anchor_nodes.push(a); // push the node object in case that needs to change 
    url_pages.push(a.href); // push the href attribute to the array of hrefs 
    } 
    return { 
    urlsOnPage: url_pages, 
    anchorTags: anchor_nodes, 
    checkDuplicateUrls: function(url_list){ 
     var duplicates = []; // instantiate a blank array 
     var j = url_list.length; 
     while(j--){ 
     var x = url_list[j]; 
     if (url_pages.indexOf(x) > -1){ // check the index of each item in the array. 
      duplicates.push(x); // add it to the list of duplicate urls 
     } 
     } 
     return duplicates; // return the list of duplicates. 
    }, 
    getAnchorsForUrl: function(url){ 
     return anchor_nodes[url_pages.indexOf(url)]; 
    } 
    } 
})() 
// to use it: 
var result = linkcheck.checkDuplicateUrls(your_array_of_urls); 

Это довольно прямо вперед, реализация чистого метода JavaScript для достижения того, что я считаю, что спецификации призывы. Это также использует блокировки, чтобы предоставить вам доступ к набору результатов в любое время, если ваш список URL-адресов изменяется с течением времени, и новый список необходимо проверить. Я также добавил полученные теги привязки в виде массива, так как мы все равно итерации, так что вы можете менять свои свойства на лету. И так как было бы полезно иметь удобный метод для получения привязывающего тега путем передачи URL-адреса (сначала в результирующем наборе). В приведенных ниже комментариях включался фрагмент для создания indexOf для IE8 и переключался document.getElementsByTagName на document.links для получения динамического списка объектов.

+1

Обратите внимание, что * Array.prototype.indexOf() * не реализован в IE 8 и старше и потребует дополнительного фрагмента, определяющего этот метод. Также обратите внимание, что ваши списки являются статическими. Вы можете использовать * document.links *, чтобы получить динамическую коллекцию элементов * A * и * AREA * на странице. –

+0

@ Andy E благодарит за информацию. Я считаю само собой разумеющимся, что реализация indexOf везде. В последнее время я использую jQuery, и я полностью расставил document.links. – Gabriel

10

getElementByTagName дает вам нодлист (массив узлов).

var a = document.getElementsByTagName('a'); 

for (var idx= 0; idx < a.length; ++idx){ 
    console.log(a[idx].href); 
} 

Я действительно предлагаю вам использовать фреймворк для этого, например jQuery. Это делает вашу жизнь намного проще.

Пример с JQuery:

$("a").each(function(){ 
    console.log(this.href); 
}); 
+1

Это довольно просто, хотя - бы это действительно будет проще с JQuery? Я думаю, что на самом деле может потребоваться больше символов для всех $ $(). Attr ('blahblah') и т. Д. –

+1

@Mark: Я добавил пример с jquery. Как вы видите, это меньше, чем печатать. – some

-1

Использование Jquery и может сделать некоторые вещи, как this-

$('a').each(function(){ 
if(urls.indexOf(this.href) !- -1) 
    alert('match found - ' + this.href); 
}) 

URLs является существующий массив нужно сравнить с.

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