Пользовательские селекторы jQuery, возвращающие совпадение для всех элементов - PullRequest
0 голосов
/ 13 апреля 2011

Я пытаюсь собрать пользовательский селектор jquery для сопоставления идентификаторов asp-клиентов в Asp.net.Я работаю над информацией из этих двух записей в блоге здесь и здесь

Проблема в том, что теперь я возвращаю совпадение для каждого элемента на странице.Я знаю, почему (это потому, что я каждый раз запрашиваю все узлы), но мой мозг абсолютно измотан, и я закодировал себя в подчинении.

Если кто-нибудь сможет выяснить, что пошло не так, и дать мненекоторые указатели я был бы очень благодарен.

Использование для селектора будет следующим:

$("input:clientID(TextBox1)")

Cheers!

РЕДАКТИРОВАТЬ: У меня есть этот код, но он вернет все узлы, заканчивающиеся наданный идентификатор.

 (function ($) {
    $.expr[":"].clientID = function (objNode, intStackIndex, arrProperties, arrNodeStack) {

        var keyValue, tName, $node, len, id;

        if (arrProperties[3]) {

            // Split into array (name,value):
            keyValue = arrProperties[3];

            // Check to see whether a tag node has been supplied.
            if (objNode) {

                // Get the name.
                tName = objNode.tagName;
                $node = $(objNode);
                id = $node.attr("id");

                if ((id.lastIndexOf(keyValue) === id.length - keyValue.length) && ($node.is(":first"))) {
                    return true;
                }
                else if (id === keyValue) {
                    return true;
                }
                else {

                    return false;
                }

            } else {

                // No node supplied so will use the ends with attribute selector.
                return $("[id$=\"_" + keyValue + "\"]").first().length > 0;
            }

        } else {

            // If we have made it this far, then we found no
            // match. Return false to indicate that this node
            // did not match our selector.
            return false;
        }
    };

} (jQuery));

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Я думаю, вы не понимаете, как должны работать селекторы jQuery.Вот как они работают.Предполагая, что вы выполняете запрос со следующим:

$("input:clientID(TextBox1)");

jQuery сначала находит все входные элементы, а затем для каждого спрашивает вашу функцию, следует ли ее включить или нет.Итак, если ваша страница содержит 10 input элементов, то ваша функция будет вызываться 10 раз.

Вам не нужно запрашивать DOM самостоятельно .

При таком понимании вам станет намного проще решать, содержит ли идентификатор узла _TextBox1 или нет.

(function ($) {
    $.expr[":"].clientID = function(objNode, intStackIndex, arrProperties, arrNodeStack) {
        // we need to something to query
        if( ! arrProperties[3] ) return false; 
        return objNode.id.indexOf( "_" + arrProperties[3] ) !== -1;
    };
} (jQuery));

Я оставлю вам специфику ASP.net, поскольку я не знаком с тем, как генерируются клиентские идентификаторы ASP.net.Тем не менее, насколько я понимаю, вы также просто сможете достичь идентичной функциональности с помощью встроенных селекторов jQuery (как уже упоминали другие).

Редактирование - Поиск отформатированных идентификаторов ASP.net

Для выбораИдентификаторы, которые могут быть «xxx_xxx_clientID» или «clientID», код может быть изменен на:

var testID = arrProperties[3];
if( objNode.id == testID ) return true;

// ends with code
testID = "_" + testID;
var lastIndex = objNode.id.lastIndexOf(testID);
return lastIndex !== -1 && lastIndex == (objNode.id.length - testID.length);

Редактировать 2 - найти только первый соответствующий элемент

Чтобы соответствовать только первомуВ результате вы можете установить переменную-флаг, когда вы что-то нашли.Это должно быть намного быстрее, но менее чисто, чем использование решения Джеймса.

(function ($) {
    // assign the clientID filter with a self-executing anonymous function
    $.expr[":"].clientID = (function(){
        // create a "private" flag variable
        var alreadyFound = false;

        return function(objNode, intStackIndex, arrProperties, arrNodeStack) {
            if( intStackIndex === 0 ) alreadyFound = false;
            if( alreadyFound ) return false;

            var testID = arrProperties[3];
            if( objNode.id == testID){
                alreadyFound = true;
            } else {
                // ends with code
                testID = "_" + testID;
                var lastIndex = objNode.id.lastIndexOf(testID);
                alreadyFound = lastIndex !== -1 && lastIndex == (objNode.id.length - testID.length);
            }

            return alreadyFound;
        };

    })();
} (jQuery));

Переменная alreadyFound доступна нашей функции clientID (и никому другому) через замыкание.

0 голосов
/ 14 апреля 2011

Я только добавляю ответ, чтобы можно было увидеть окончательный код.Я не смог бы добиться этого без Скаббеса, поэтому он получит очки.

Селектор возвращает первый экземпляр элемента управления asp с заданной клиентурой.Это работает без тэга (хотя это намного медленнее).Я оптимизировал его в меру своих способностей, но если бы кто-нибудь смог ускорить его, это было бы неплохо.

0 голосов
/ 13 апреля 2011

Немного из коробки, но как насчет того, чтобы изменить ClientIDMode на Static и не беспокоиться об этом?

<asp:Label ID="Label1" runat="server" ClientIDMode="[Mode Type]" />

http://weblogs.asp.net/asptest/archive/2009/01/06/asp-net-4-0-clientid-overview.aspx

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