получение значений из выбора и перемещение их в ul - jquery - PullRequest
0 голосов
/ 03 октября 2011

В настоящее время я создаю плагин, который позволяет мне изменять поля выбора на что-то симпатичное, я делаю это, изменяя поля выбора, которые находятся на странице, в списки определений, с описанием определения, которое я вкладываюul в нем, а li - значения из списка выбора.

У меня, однако, проблема, если, например, у меня есть 3 поля выбора на странице, я получаю странную ошибку и не могу точно определить, гдев моем коде я ошибаюсь, но что означает, что несколько dd добавляются к каждому dl, поэтому, например, второй dl имеет 2 dd, где, как и должно быть, должно быть, как в 3-м окне выбора1 dd но у него 3, кажется, что количество созданных dd соответствует индексу цикла.Как я могу сделать так, чтобы только один dd, создавался для dl, и чтобы были добавлены правильные опции.

Это мой код плагина,

    /***********
* Select-Me create pretty select lists using a <ul> inplace of the <select>
* Author: Simon Ainley (on behalf of The Factory Agency)
* Version: 0.0.1
***********/
(function($){  
    $.fn.selectMe = function(options) {  
        var defaults = {
            select_text : null,
            remove_first_value : false,
            speed : 1000
        }

        var options = $.extend(defaults, options);

        return this.each(function(index) {
            //get an instance of the object we are working with
            var obj = $(this);
            var obj_name = obj.attr('name');
            console.log(obj_name);
            obj.closest('form').append('<input type="hidden" class="dropdown_value" value="" name="'+obj_name+'"/>');
            var options = $("option", obj);
            var replacement_list_heading = "<dl class='dropdown "+obj_name+"'><dt><span>"+defaults.select_text+"</span><a href=''>Go</a></dt></dl>";
            obj.closest('form').prepend(replacement_list_heading);
            var values_start = "<dd class='shadow_50'><ul></ul></dd>";
            $(".dropdown").append(values_start);
            if(defaults.remove_first_value == true) {
                options.splice(0, 1);
            }
            options.each(function(index){
                    $(".dropdown." + obj_name + " dd ul").append(
                        '<li><a href="#"><span class="option">' + 
                        $(this).text() + '</span><span class="value">' + 
                        $(this).val() + '</span></a></li>'
                    );

            });

            obj.remove();

            $('.dropdown li a').hover(function() {
                $(this).parent('li').addClass('hover');
            }, function() { 
                $(this).parent('li').removeClass('hover');
            });

            $(".dropdown dt a").click(function(e) {
                $(this).closest("dl").find("dd").slideToggle(defaults.speed);
                e.preventDefault();
            });

            $(".dropdown ul a").click(function(e) {
                var value = $(this).find('span').text();
                $(this).addClass('selected');
                $(".dropdown_value").val(value);
                $(".dropdown dt span").text($('.selected .option').text());
                $(".dropdown dd").slideUp(defaults.speed);
                $(this).removeClass('selected');
                e.preventDefault();
            });
        });
    };  
})(jQuery);

Я считаю, что проблемы в этихразделы кода,

var options = $("option", obj); - я думаю, мне нужно различать каждый набор опций?

options.each(function(index){

                    $(".dropdown." + obj_name + " dd ul").append(
                        '<li><a href="#"><span class="option">' + 
                        $(this).text() + '</span><span class="value">' + 
                        $(this).val() + '</span></a></li>'
                    );

            });

Я считаю, что этот бит просто зацикливается независимо от того, должен ли он останавливаться идобавьте параметры в новый dd?

любая помощь будет отличной!

Как я вызываю свой плагин,

    $(".type select").selectMe({
    select_text : "I'm looking for...",
    remove_first_value : true,
});

$(".skill select").selectMe({
    select_text : "Skill",
    remove_first_value : true,
});

$(".gender select").selectMe({
    select_text : "Gender",
    remove_first_value : true,
});

и HTML, который изменяется,

    div class="grid_4">
                        <fieldset>
                                <div class="formRow drop_down">

<select name="type">
<option value="0" selected="selected">I'm looking for...</option>
<option value="1">actors</option>
<option value="2">presenters</option>
<option value="3">voice overs</option>
</select>
    </div>
                        </fieldset>
                    </div>

                    <div class="grid_4">

                        <fieldset>
                                <div class="formRow drop_down">
<select name="skill">
<option value="0" selected="selected">Skill</option>
<option value="1">actors</option>
<option value="2">presenters</option>
<option value="3">voice overs</option>
<option value="4">dancers</option>
<option value="5">accents</option>

<option value="6">film</option>
<option value="7">tv</option>
</select>
    </div>
                        </fieldset>
                    </div>

                    <div class="grid_4">
                        <fieldset>  
                                <div class="formRow drop_down">
<select name="gender">

<option value="0" selected="selected">Gender</option>
<option value="1">male</option>
<option value="2">female</option>
</select>
    </div>
                        </fieldset>
                    </div>

1 Ответ

0 голосов
/ 03 октября 2011

В его нынешнем виде я не совсем уверен, как он работает, селектор ".type select" не вернет ничего из предоставленного вами HTML-кода - для этого вам понадобится <div class='type' > и </div> обернуты вокруг вашего первого <select>.

Я понимаю, почему вы получаете несколько DD, хотя в вашем плагине вы выполняете это:

var values_start = "<dd class='shadow_50'><ul></ul></dd>";
$(".dropdown").append(values_start);

Этот селектор будет нацелен на каждый класс .dropdown, который вы создали на странице. Поэтому для каждого последующего вызова плагина вы будете добавлять элементы DD в элементы DL, которые вы уже создали.

Я думаю, что вы хотите $(".dropdown." + obj_name).append(values_start); вместо.

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

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

...