Показать сообщение отдельно
  #1 (permalink)  
Старый 25.03.2011, 14:40
Интересующийся
Отправить личное сообщение для dima_zluka Посмотреть профиль Найти все сообщения от dima_zluka
 
Регистрация: 20.03.2011
Сообщений: 12

getElementsByClassName
Это мой вариант функции getElementsByClassName. Я в нём я попытался учесть все варианты.
function byClass(elem,classList){
    if(typeof elem=='string'){
        classList=elem;
        elem=document;
    }
    var retElems=[];
    if(elem.getElementsByClassName)//Проверяем поддержку getElementsByClassName
        retElems=elem.getElementsByClassName(classList);
    else if(elem.querySelectorAll)//Разбиваем строка на массив и тут же склеиваем с вставкой ' .'
        retElems=elem.querySelectorAll('.'+classList.split(' ').join('.'));
    else{//Если нет то ищем вручную 
        classList=classList.split(' ');//Разбираем на масcив 'class1 class2'.split(' ')=['class1','class2']
        var classElemList=[];
        var elemList=elem.getElementsByTagName('*');//Получаем всех потомков elem
        var trueList=[];
        var elemLen=elemList.length;
        for(var a=0;a<elemLen;a++){//Перебор всех элементов
            classElemList=elemList[a].className.split(' ');//Разбираем на массив классы текущего
            if(classElemList.length>=classList.length){//Если количество классов больше то продолжаем
                trueList=[];
                //Дальше идёт проверка есть ли эти классы  в элементе
                for(var b=0;b<classElemList.length;b++)
                    for(var c=0;c<classList.length;c++)
                        if(classElemList[b]==classList[c]) trueList.push(true);
                //Если количество совпавших равно то добавляем
                if(classList.length==trueList.length)retElems.push(elemList[a]);
                //Больше нельзя будут не совпадения с getElementsByClassName
            }
        }
    }
    return retElems;
}

Переделал, добавил querySelectorAll и немного увеличил скорость.
Пример использования
byClass(document.getElementById('div1'),'nav class1')[2].style.color='#0ff';

или
byClass('class2')[0].style.color='#f00'
Хочу узнать про недоработки.
Заранее спасибо.

Последний раз редактировалось dima_zluka, 25.03.2011 в 20:29.
Ответить с цитированием