Как я могу ускорить JQuery: выбранный селектор? - PullRequest
3 голосов
/ 12 февраля 2009

У меня есть выпадающее меню на веб-странице с 3830 элементами. Я знаю, чрезмерно, но что угодно.

В jquery я получаю значение выбранного параметра, используя оператор:

$ ("#institutionCombo: selected") .val ();

Есть заметная пауза, прежде чем выбор будет найден. Как только я получу это значение, я вставлю его в текстовое поле на странице, чтобы я знал, как быстро. Плюс я проверил это, используя точки останова в Firebug.

Если я пойду в старую школу и использую этот javascript:

var div = document.getElementById ("maindiv");
var select = div.getElementsByTagName ("select") [0];
var ix = select.selectedIndex;
var instId = select.options [ix] .value;

Эта скорость мгновенная.

Есть ли что-то наследуемое в jquery, которое делает селектор: selected настолько медленным, когда числа становятся слишком высокими? Я хотел бы придерживаться jquery повсюду в моих скриптах, есть ли у кого-нибудь предложение ускорить поиск выбранной опции в jquery?

Спасибо

Craig

Ответы [ 2 ]

10 голосов
/ 12 февраля 2009

Нет необходимости вызывать: selected при получении значения в поле выбора.

Поведение по умолчанию - получить selectedIndex

$( "#institutionCombo").val();

Как отмечено в комментарии, если вам нужен доступ к тексту этой опции, вы можете использовать

$( "#institutionCombo option[value=" + $( "#institutionCombo").val(); + "]").text();

хотя, если вы знаете, что вам нужно свойство text, и оно отличается от значения, вы можете просто использовать selectedIndex напрямую.

var combo = $("#institutionCombo").get(0); 
combo = combo ? combo : {selectedIndex: -1}; // handle no combo returned
if (combo.selectedIndex < 0)
  return; // nothing selected
$('#institutionCombo option:eq(' + combo.selectedIndex + ')').text()

Вот фрагмент из источника jquery (v1.3)

val: function( value ) {
    // ...  
    // We need to handle select boxes special
    if ( jQuery.nodeName( elem, "select" ) ) {
        var index = elem.selectedIndex,
            values = [],
            options = elem.options,
            one = elem.type == "select-one";

        // Nothing was selected
        if ( index < 0 )
            return null;

        // Loop through all the selected options
        for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
            var option = options[ i ];

            if ( option.selected ) {
                // Get the specifc value for the option
                value = jQuery(option).val();

                // We don't need an array for one selects
                if ( one )
                    return value;

                // Multi-Selects return an array
                values.push( value );
            }
        }

        return values;  
    // ...  
},

Когда вы вызываете: selected селектор, который проходит цикл по всем потомкам select-элементов, ища свойство .selected, которое нужно установить, и возвращает массив any. В любом случае, если вы это сделаете, все потомки будут зациклены, так что не делайте этого.

0 голосов
/ 12 февраля 2009

Вы можете сделать это:

var ix = $ ("#institutionCombo") .attr ("selectedIndex");

var value = $ ("опция #institutionCombo: eq (" + ix + ")") .val ();

но это действительно то, что вы делаете в коде старой школы.

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

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

$ ("опция #institutionCombo: selected") .val ();

(примечание: выбрано против: выбрано)

...