jqTransform Select - выделите набранную букву - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть форма, которая использует jqTransform для замены стандартных полей выбора и переключателей.Все работает отлично и прекрасно, за исключением одной вещи, которая меня раздражает:

Так как она заменяет поле выбора списком ссылок, при вводе буквы для прокрутки она ничего не делает.Например, вы нажимаете, чтобы открыть выбор, затем набираете S. Это должно прокрутить до первого S в списке, но ничего не происходит.Есть ли способ восстановить эту функциональность?Ниже приведен код jqTransform для поля выбора.Я не вижу обработчика для такого типа вещей:

/***************************
  Select 
 ***************************/   
$.fn.jqTransSelect = function(){
    return this.each(function(index){
        var $select = $(this);

        if($select.hasClass('jqTransformHidden')) {return;}
        if($select.attr('multiple')) {return;}

        var oLabel  =  jqTransformGetLabel($select);
        /* First thing we do is Wrap it */
        var $wrapper = $select
            .addClass('jqTransformHidden')
            .wrap('<div class="jqTransformSelectWrapper"></div>')
            .parent()
            .css({zIndex: 10-index})
        ;

        /* Now add the html for the select */
        $wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
        var $ul = $('ul', $wrapper).css('width',$select.width()).hide();
        /* Now we add the options */
        $('option', this).each(function(i){
            var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
            $ul.append(oLi);
        });

        /* Add click handler to the a */
        $ul.find('a').click(function(){
                $('a.selected', $wrapper).removeClass('selected');
                $(this).addClass('selected');   
                /* Fire the onchange event */
                if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) { $select[0].selectedIndex = $(this).attr('index'); $select[0].onchange(); }
                $select[0].selectedIndex = $(this).attr('index');
                $('span:eq(0)', $wrapper).html($(this).html());
                $ul.hide();
                return false;
        });
        /* Set the default */
        $('a:eq('+ this.selectedIndex +')', $ul).click();
        $('span:first', $wrapper).click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
        oLabel && oLabel.click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
        this.oLabel = oLabel;

        /* Apply the click handler to the Open */
        var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
            .click(function(){
                //Check if box is already open to still allow toggle, but close all other selects
                if( $ul.css('display') == 'none' ) {jqTransformHideSelect();} 
                if($select.attr('disabled')){return false;}

                $ul.slideToggle('fast', function(){                 
                    var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
                    $ul.animate({scrollTop: offSet});
                });
                return false;
            })
        ;

        // Set the new width
        var iSelectWidth = $select.outerWidth();
        var oSpan = $('span:first',$wrapper);
        var newWidth = (iSelectWidth > oSpan.innerWidth())?iSelectWidth+oLinkOpen.outerWidth():$wrapper.width();
        $wrapper.css('width',newWidth);
        $ul.css('width',newWidth-2);
        oSpan.css({width:iSelectWidth});

                     $ul.css({height:'420px','overflow':'hidden'});

        // Calculate the height if necessary, less elements that the default height
        //show the ul to calculate the block, if ul is not displayed li height value is 0
        $ul.css({display:'block',visibility:'hidden'});
        var iSelectHeight = ($('li',$ul).length)*($('li:first',$ul).height());//+1 else bug ff
        (iSelectHeight < $ul.height()) && $ul.css({height:iSelectHeight,'overflow':'hidden'});//hidden else bug with ff
        $ul.css({display:'none',visibility:'visible'});

    });
};

Вот что мы пытались сделать, чтобы реализовать это:

var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
   .keypress(function (e) {
       $.each(myArray, function (i, l) {
           var sc = l.substr(0, 1).toLowerCase();
           var kc = String.fromCharCode(e.which);
           if (sc == kc) {
               $select[0].selectedIndex = i;
               $('span:eq(0)', $wrapper).html(l);
               $ul.hide();
               return false;
            }
});
});

Ответы [ 4 ]

0 голосов
/ 13 марта 2014

Добавьте следующий код в конце return this.each (function (index) {...}); то есть внутри функции $ .fn.jqTransSelect.

Также вам необходимо установить плагин scrollTo jquery.

КОД:

var newChar;
$(document).bind("keydown", function (e) {
    var char = String.fromCharCode(e.which);
    var code = e.keyCode || e.which;
    var charFound;

if( $ul.css('display') != 'none' ){
    if (newChar != char){
        newChar = char;

            $ul.find('a').each(function(){
                // Find first occurence of li that starts with letter typed
                if ($(this).text().substr(0,1).toUpperCase() == char && $(this).text() != "Choose"){
                    charFound = true;

                    $('a.selected', $wrapper).removeClass('selected');
                    $(this).addClass('selected');
                    $select[0].selectedIndex = $(this).attr('index');
                    $($select[0]).trigger('change');
                    $that = $(this);

                    return false;
                }
            });

            if (charFound == true){
                // Scroll to selected value
                $ul.scrollTo($('a.selected', $ul), 400);
            }
        }

        //If Enter has been pressed, select the value
        if(code == 13) { 
            $('span:eq(0)', $wrapper).html($that.html());
            $ul.hide();
            return false;
        }
    }
});
0 голосов
/ 30 марта 2012

решение для jqTransform выберите нажатие клавиши рабочей ссылки визит http://www.techapparatus.com/jqtransform-select-problem-with-keyboard-type-solution

0 голосов
/ 23 декабря 2013

Эта ссылка предоставляет рабочее решение:

http://www.techapparatus.com/jqtransform-select-problem-with-keyboard-type-solution.html

0 голосов
/ 15 декабря 2011

О черт. Я скучал по большой картине без кода. Теперь я вижу, что происходит ... да, нет "восстановления" функциональности, поскольку новый список ссылок больше не является окном выбора. Если jqTransform по умолчанию не включает прокручиваемый параметр, я думаю, вам придется его реализовать.

Если вы посмотрите на их демонстрационную страницу, их «простое» окно выбора работает должным образом (хотя это трудно заметить, поскольку все опции начинаются с «O», оно перейдет к первому «варианту») и их стилизованное поле выбора не.

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

Боюсь, это не тот «ответ», на который вы, вероятно, надеялись. Если повезет, кто-то, кто делал подобные вещи, услышит вашу просьбу. ; -)

...