ручная оптимизация JavaScript-функцию селектора


Я лично хочу маленькую функцию селектора, который охватывает три общих случаях

  • метода getElementById
  • getElementsByClassName
  • метод getelementsbytagname

Она должна поддерживать контекстах и не должны поддерживать querySelectorAll с QSA-это медленно, как ад, и его следует избегать

У меня есть реализация такой функции

function select(selector, context) {
    var c = selector.charAt(0),
        method;

    if (c === "#") {
        method = "getElementById";
        selector = selector.substring(1);
    } else if (c === ".") {
        method = "getElementsByClassName";
        selector = selector.substring(1);
    } else {
        method = "getElementsByTagName";
    }

    return (context || document)[method](selector);
}

И у меня есть ориентир.

Как видно, это все-таки фактор 4 вдали от родных поддержки.

Я могу оптимизировать этот дальше? И если да, то как?



290
3
задан 10 декабря 2011 в 04:12 Источник Поделиться
Комментарии
3 ответа

Это в два раза медленнее, родной (оригинальный будучи 4 раза медленно)

function select (selector, context) {
var c = selector.charAt(0),
method,
context = context || document;

if (c === '#') {
selector = selector.substring(1);
method = context.getElementById(selector);
}

else if (c === '.') {
selector = selector.substring(1);
method = context.getElementsByClassName(selector);
}

else {
method = context.getElementsByTagName(selector);
}

return method
}

3
ответ дан 10 декабря 2011 в 04:12 Источник Поделиться

Ну , вы должны иметь в виду, что не все браузеры реализуют getElementsByClassName, даже не все ( что называется ) "правильные браузеры".

Вы должны добавить решение для такой проблемы.

Что сказал, Вы, вероятно, могли бы избавиться, по меньшей мере, одно если , если вы используете что-то вроде { '.': 'getElementsByClassName', '#': 'метода getElementById' };. Просто положите указанного объекта на закрытие, в противном случае вы бы создавать его каждый раз заново.

1
ответ дан 10 декабря 2011 в 04:12 Источник Поделиться

Я не уверен, почему никто не предложил переключиться ?

Как я понимаю, это переключатель будет равна или быстрее, чем если заявления изменить:- кроме хрома ... да!?

switch(c)
{
case '#':
...
break; // or return
case '.':
...
break; // or return
default
...
break; // or return
}

http://jsperf.com/select-vs-natives-vs-jquery/6

1
ответ дан 15 декабря 2011 в 12:12 Источник Поделиться