0

我有一个简单的表单,用户可以在其中选择一种颜色,然后从该颜色类别中选择一个东西。第二个选择输入基于第一个输入进行更新。

我有一个 jQuery 脚本,它允许我基于 id 定位第一个元素,并在指定它的 id 时相应地更改下一个元素。现在我想把它变成一个可重用的脚本,这样我就可以选择任何选择并相应地更新 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。所以我希望当一个被改变时,NEXT 将成为目标。我不能依赖 ids 或 classes。

<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

如果你想制作可重用的代码(可以在其他脚本中使用),你可以创建一个实用函数

只需使用三个参数调用 nextSelect;(1)第一个选择,(2)第二个选择将根据select1改变,(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>

​这里有一个小提琴

如果这不是您想要的,请提供反馈,我会调整代码。

干杯!

编辑:

这样我就可以选择任何选择并相应地更新 NEXT 选择。

好的,所以如果我理解正确,您希望能够选择第一个“选择”-> 这意味着您需要以某种形式对 id/class 的引用进行硬核。这不需要是选择本身,它可以是一个包装类。第二个选择将被自动选择。

修改了代码和小提琴以适应它。

于 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 回答