Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить имя метода из вызова данного метода 
V
    Опции темы
JAYBE
Дата 28.8.2012, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Добрый день.
Есть код:
Код

Node.fn.removeClass = function(classname){
    var re = new RegExp("(^|\\s)" + classname + "(\\s|$)", "g"), self = this;
    self.className = self.className.replace(re, "$1").replace(/\s+/g, " ").replace(/(^ | $)/g, "");
    return self;
}

Такое же хотелось бы сделать для NodeList, но реализвоано так:
Код

NodeList.fn.removeClass = function removeClass(classname) {
    var array = this; length = array.length, nodeList = document.createDocumentFragment();
    while(length--) {
        nodeList.appendChild( array[length].removeClass(classname) );
    }
    return nodeList.childNodes;
}


Как можно получить название метода removeClass при вызове этого метода у класса NodeList?

Так как методов для класса Node много, то хотелось бы поулчить что-то вроде:
Код

NodeList.fn.removeClass  = NodeList.fn.addClass = NodeList.fn.toggleClass = function() {
var array = this; length = array.length, nodeList = document.createDocumentFragment();
    while(length--) {
        //nodeList.appendChild( array[length].removeClass(classname) );
        вызов имени текущего метода для кажого объекта
    }
}


Это сообщение отредактировал(а) Aliance - 29.8.2012, 13:33
PM   Вверх
нуп
Дата 28.8.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: 12
Всего: 33



Название врятли получите, а ссылку можно через arguments.callee получить
PM MAIL   Вверх
ksnk
Дата 28.8.2012, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Код

for(var a in {'removeClass':0,'addClass':0,'toggleClass':0})
    NodeList.fn[a]  = (function(a){
      var Name=a;return function(ClassName) {
      var array = this, length = array.length, nodeList = document.createDocumentFragment();
        while(length--) {
            nodeList[Name](ClassName);
        }
        //alert([Name,ClassName]);
    }
    })(a);


Это сообщение отредактировал(а) ksnk - 28.8.2012, 18:28


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
JAYBE
Дата 29.8.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



ksnk, спасибо, разобрался.
Получился следюущий полный код:
Код

(function(window, undefined) {

if(document.getElementsByClassName) {
    getElementsByClass = function(classList, node) {   
        return (node || document).getElementsByClassName(classList)
    }
} else {
    getElementsByClass = function(classList, node) {           
        var node = node || document,
            list = node.getElementsByTagName('*'),
            length = list.length, 
            classArray = classList.split(/\s+/),
            classes = classArray.length,
            result = [], i,j;
        for(i = 0; i < length; i++) {
            for(j = 0; j < classes; j++)  {
                if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
                    result.push(list[i]);
                    break;
                }
            }
        }
        return result;
    }
}

Node.fn = Node.prototype;
Node.fn.addClass = function(classname){
    var re = new RegExp("(^|\\s)" + classname + "(\\s|$)", "g"), self = this;
    if(!self.getAttribute("class")) self.className="";
    if (re.test(self.className)) return
        self.className = (self.className + " " + classname).replace(/\s+/g, " ").replace(/(^ | $)/g, "");
    return self;
}
Node.fn.removeClass = function(classname){
    var re = new RegExp("(^|\\s)" + classname + "(\\s|$)", "g"), self = this;
    self.className = self.className.replace(re, "$1").replace(/\s+/g, " ").replace(/(^ | $)/g, "");
    if (!self.className) 
        return ( self.removeAttribute("class") )
    else return self
}
Node.fn.toggleClass = function(class1, class2) {
    var self = this,
        re1 = new RegExp("(^|\\s)" + class1 + "(\\s|$)", "g");
    self.className = self.className.replace(re1, class2).replace(/\s+/g, " ").replace(/(^ | $)/g, "");
    return self;
}

NodeList.fn = NodeList.prototype;

var selfArray = ["addClass", "removeClass", "toggleClass"],
    length = selfArray.length;
while(length--) {
    
    var a = selfArray[length];
    NodeList.fn[a] = (function(a) {
        var Name=a;return function(classname) {
            var array = this,
                length = array.length,
                nodeList = document.createDocumentFragment();
            while(length--) {    
                //nodeList.appendChild( array[length][Name](classname) );
                array[length][Name](classname);
            }
            return this;
        }
    })(a)
}
newNodeFunction = function() {}
})(window)


Как сделать, чтобы методы для класса NodeList возвращали массив?
При использовании nodeList.appendChild( array[length][Name](classname) ) они пропадют с документов...

И главная проблема - почему он не работает в ИЕ 9?    smile 

Это сообщение отредактировал(а) JAYBE - 29.8.2012, 14:04
PM   Вверх
ksnk
Дата 31.8.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Цитата(JAYBE @  29.8.2012,  10:24 Найти цитируемый пост)
Как сделать, чтобы методы для класса NodeList возвращали массив?

Что вообще хочется сделать? 
Каким хочется видеть код программы?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
JAYBE
Дата 31.8.2012, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Необходимо написать framework для работы с css-классами DOM-элементов. Видется через прототипирование, но IE модель как я уже начитался не позволяет это сделать простым способом.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.