0

ユーザーが色を選択してから、その色のカテゴリから物を選択できる単純なフォームがあります。2 番目の選択入力は、最初の入力に基づいて更新されます。

IDに基づいて最初の要素をターゲットにし、IDが指定されたときにそれに応じて次の要素を変更できるjQueryスクリプトがあります。これを再利用可能なスクリプトにして、ANY 選択を選択し、それに応じて NEXT 選択を更新できるようにします。内部ロジック (url、GET パラメーター) を処理できます。

私のjQueryスクリプトでは:パラメーターを取得します)が、選択した要素の後に次の選択要素をターゲットにする方法がわかりません(next()で試しましたが、機能しませんでした)。

$(document).ready(function () {
    var nextSelect = $('#id_colour');
    nextSelect.change(function () {
        function updateChoices() {
            var selected = nextSelect.val();
            if (selected) {
                // this line shown for completeness - will be refactored
                $.getJSON(url, {
                    colour_id: selected
                }, function (data, jqXHR) {
                    var options = [];
                    for (var i = 0; i < data.length; i++) {
                        output = '<option value="' + data[i].id + '"';
                        if (nextSelect.val() == data[i].id) {
                            output += ' selected="selected"';
                        }
                        output += '>' + data[i].name + '</option>';
                        options.push(output);
                    }
                    $('#id_thing').html(options.join(''));
                });
            }
        }
        updateChoices();
        $('#id_thing').change(updateChoices);
    });
});

どんな助けでも大歓迎です。

編集 ここにhtmlがあります。だから私は、1つが変更されたときにNEXTがターゲットになるようにしたい. IDやクラスに頼ることはできません。

<form action="" method="post">
    <!-- colour -->
    <div class="form_div">
        <p><label for="colour">Colour:</label></p>
        <p>
            <select name="colour" id="id_colour">
                <option value="" selected="selected">---------</option>
                <option value="1">Green</option>
                <option value="2">Brown</option>
                <option value="3">Blue</option>
            </select>
        </p>
    </div>  
    <!-- thing -->
    <div class="form_div">
        <p><label for="thing">Thing:</label></p>
        <p>
            <select name="thing" id="id_thing">
                <option value="" selected="selected">---------</option>
                <option value="1">Branch</option>
                <option value="2">Leaf</option>
                <option value="3">Sky</option>
            </select>
        </p>
    </div> 

    <p><input type="submit" value="Submit Choice" /></p>
</form>
4

2 に答える 2

1

再利用可能なコード(他のスクリプト内で使用される可能性があります)を作成する場合は、ユーティリティ関数を作成できます。

3つのパラメーターを指定してnextSelectを呼び出すだけです。(1)最初の選択、(2)select1に応じて変更される2番目の選択、(3)リクエストを実行するURL。

JQuery(v1.8.2):

// Utility function
$.nextSelect = function(selectOne, selectTwo, url) {
    var s1 = $(selectOne);
    s1.on('change', function() {
        var colourID = s1.val();
        if (colourID) {
            $.getJSON(url, {colour_id: colourID}, function(data, jqXHR){
                $(selectTwo + ' option:selected').removeAttr('selected');
                $(selectTwo + ' option[value="' + data[0].id + '"]').attr('selected', 'selected');
            });
            //Example of what the getJSON might do:
            $(selectTwo + ' option:selected').removeAttr('selected');
            $(selectTwo + ' option[value="' + 1 + '"]').attr('selected', 'selected');
            //End example. Remove/comment example when going live.
        }
    });        
};
//I have left the url empty for now,
//$.nextSelect('#id_colour', '#id_thing', '');
//If you allowed to at least select the container div:
$mySelectedForm = $('.form_div').first();
$.nextSelect("#" + $mySelectedForm.find('select').attr('id'), "#" + $mySelectedForm.next().find('select').attr('id'), '');

HTML(私はそれを短くしました):

<div class="form_div">
    <select name="colour" id="id_colour">
        <option value="" selected="selected">---------</option>
        <option value="1">Green</option>
        <option value="2">Brown</option>
        <option value="3">Blue</option>
    </select>
</div>
<div class="form_div">
    <select name="thing" id="id_thing">
        <option value="" selected="selected">---------</option>
        <option value="1">Branch</option>
        <option value="2">Leaf</option>
        <option value="3">Sky</option>
    </select>
</div>

これがフィドルです

これがあなたが探していたものではなかった場合は、フィードバックを添えてください。コードを調整します。

乾杯!

編集:

任意の選択を選択し、それに応じて次の選択を更新できるようにします。

さて、私が正しく理解していれば、最初の「選択」を選択できるようにしたい->何らかの形でID/クラスの参照をハードコアにする必要があることを意味します。これはselect自体である必要はなく、ラッパークラスにすることができます。2番目の選択は自動的に選択されます。

コードとフィドルを修正して調整しました。

于 2012-10-19T22:12:56.530 に答える
0

$(this). next() は私にとってはうまくいきます

http://jsfiddle.net/cWQhg/1/

HTML

<div id="parent">
<div class="nextsel">I'm div</div>
<div class="nextsel">I'm div</div>
<div class="nextsel">I'm div</div>
<div class="nextsel">I'm div</div>
<div class="nextsel">I'm div</div>
<div class="nextsel">I'm div</div>
<div class="nextsel">I'm div</div>
</div>
​

CSS

.nextsel {
  margin: 5px;
  border: 1px solid black;    
  height: 40ps;
    width: 100px;
    cursor: pointer;
}
.nextsel.current {
 background: red;    
}
.nextsel.next {
 background: blue;    
}

JS

var nextsel=$('.nextsel');
nextsel.click(function(e) {
    var t=$(this);
    t.addClass('current');
    t.siblings('.nextsel').removeClass('current');
    nextsel.removeClass('next');
    console.log(t.nextAll('.nextsel').first().addClass('next'));

});
​

</p>


あなたの質問からのサンプルで:

http://jsfiddle.net/FU7fZ/

HTML

<form action="" method="post">
    <!-- colour -->
    <div class="form_div">
        <p><label for="colour">Colour:</label></p>
        <p>
            <select name="colour" id="id_colour">
                <option value="" selected="selected">---------</option>
                <option value="1">Green</option>
                <option value="2">Brown</option>
                <option value="3">Blue</option>
            </select>
        </p>
    </div>  
    <!-- thing -->
    <div class="form_div">
        <p><label for="thing">Thing:</label></p>
        <p>
            <select name="thing" id="id_thing">
                <option value="" selected="selected">---------</option>
                <option value="1">Branch</option>
                <option value="2">Leaf</option>
                <option value="3">Sky</option>
            </select>
        </p>
    </div> 
     <!-- next -->
    <div class="form_div">
        <p><label for="thing">Next:</label></p>
        <p>
            <select name="next" id="id_thing">
                <option value="" selected="selected">---------</option>
                <option value="1">Tree</option>
                <option value="2">Nut</option>
                <option value="3">Deep</option>
            </select>
        </p>
    </div> 

js

var selector='.form_div select';
var changef=function () {
    var t=$(this);

    var n=t.parents('.form_div').nextAll('.form_div').first().find('select').val(t.val()); 
    if (n.length==0) {
        //it is last ....
        n=t.parents('.form_div').siblings().first().find('select').val(t.val())  ;
    }
    //uncomment to change all in recursive way
      /*
    t.addClass('changed');    
    if (!n.hasClass('changed')) {n.trigger('change');return;}
    $(selector).removeClass('changed');
    */
}
             
             
$(selector).change(changef);​
于 2012-10-19T20:39:12.003 に答える