Существуют ли какие-либо учебные пособия по jQuery, демонстрирующие авторские плагины для принятия синтаксиса селектора? - PullRequest
2 голосов
/ 08 июля 2010

Я пытаюсь написать свой первый плагин jQuery для запроса многомерных массивов сложных объектов. Он вроде работает так, как я хочу, но сейчас он получает имя свойства и значение в качестве входных данных для сравнения элементов. Я хочу изменить его так, чтобы он мог получать синтаксис селектора jQuery в качестве входных данных, чтобы фильтровать мои объекты более всеобъемлющим образом.

Я хочу иметь возможность предоставлять синтаксис, такой же или похожий на синтаксис «родного» селектора jquery:

"string"
"number"
"boolean"
"object"
"string,number,boolean"
"object[FirstName='Ben'][LastName='Alabaster']"
"object[LastName^='Ala']"
"object[LastName$='er']"

и т.д.

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

1 Ответ

3 голосов
/ 08 июля 2010

Синтаксис селектора, который использует jQuery, был абстрагирован в библиотеку Sizzle . Вы можете просмотреть источник для Sizzle на GitHub.

Sizzle довольно четко настроен для запросов к объектной модели документа, поэтому вам придется вносить изменения, чтобы он мог выполнять запросы к другим видам данных. Взгляните на строки с 294 по 303:

match: {
    ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
    CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
    NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
    ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
    TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
    CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
    POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
    PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
},

А вот код, который появляется для разбора селекторов атрибутов, таких как ^= и ~=, строки от 661 до 691:

ATTR: function(elem, match){
    var name = match[1],
        result = Expr.attrHandle[ name ] ?
            Expr.attrHandle[ name ]( elem ) :
            elem[ name ] != null ?
                elem[ name ] :
                elem.getAttribute( name ),
        value = result + "",
        type = match[2],
        check = match[4];

    return result == null ?
        type === "!=" :
        type === "=" ?
        value === check :
        type === "*=" ?
        value.indexOf(check) >= 0 :
        type === "~=" ?
        (" " + value + " ").indexOf(check) >= 0 :
        !check ?
        value && result !== false :
        type === "!=" ?
        value !== check :
        type === "^=" ?
        value.indexOf(check) === 0 :
        type === "$=" ?
        value.substr(value.length - check.length) === check :
        type === "|=" ?
        value === check || value.substr(0, check.length + 1) === check + "-" :
        false;
},

То, как используются эти регулярные выражения и логика, может дать вам представление о том, как реализовать запросы к структуре данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...