Javascript 5级相互依存选择列表

Javascript 5级相互依存选择列表,javascript,jquery,Javascript,Jquery,我很高兴有这样的地方,这样人们就可以解决他们的问题,即使是像我这样的初学者!我不知道我们从这里出发 $('#years').change(function() { //do something like Populate models.... } 我试图创建一个相互依赖的列表,列出汽车品牌、车型、年份、驾驶员和规模 我已经创建了字段,我可以根据所做的选择填充汽车品牌和汽车模型。我一直在思考如何根据前面框中的选择填充“年份”字段。我知道第一个盒子需要一个函数。这是我的密码 HTML: Jav

我很高兴有这样的地方,这样人们就可以解决他们的问题,即使是像我这样的初学者!我不知道我们从这里出发

$('#years').change(function() {
  //do something like Populate models....
}
我试图创建一个相互依赖的列表,列出汽车品牌、车型、年份、驾驶员和规模

我已经创建了字段,我可以根据所做的选择填充汽车品牌和汽车模型。我一直在思考如何根据前面框中的选择填充“年份”字段。我知道第一个盒子需要一个函数。这是我的密码

HTML:

JavaScript:

jQuery(function($) {
    initModels();

    function initModels() {
        var makesAndModels = {
            'Ford': ['Fiesta', 'Focus', 'Mondeo'],
            'Vauxhall': ['Astra', 'Cavalier', 'Vectra']
        };

        // Populate makes
        $.each(makesAndModels, function (k, v) {
            $('#makes').append('<option>' + k + '</option>');
        });

        // Populate models
        $('#makes').change(function() {
            var $models = $('#models');

            $models.html("");

            var models = makesAndModels[$(this).val()];

            $.each(models, function (k, v) {
                $models.append('<option>' + v + '</option>');
            });
        });
    }
});
我希望你们能给我一些指导,因为我不知道从这里该往哪里走

$('#years').change(function() {
  //do something like Populate models....
}

那么,有什么区别呢?

好的,这是一个很长的答案,我花了很长时间准备,所以请耐心等待,做好准备。另外,如果你不想读这篇文章,下面还有一个答案

将每辆车作为一个单独的对象存储会更好。如果您有一个数据库或计划在将来使用,这就是存储数据的方式。嵌套数组也会带来指数级的痛苦,因此最好远离它们。首先,我们将您的数据结构更改为:

var vehicles = [
    { make: 'Ford', model: 'Fiesta', year: '2001', driver: 'me', scale: '1:43' },
    { make: 'Ford', model: 'Fiesta', year: '2005', driver: 'me', scale: '1:33' },
    { make: 'Ford', model: 'Focus', year: '1999', driver: 'you', scale: '1:18' },
    { make: 'Ford', model: 'Modeo', year: '1998', driver: 'Nigel Mansell', scale: '1:43' },
    { make: 'Vauxhall', model: 'Astra', year: '2002', driver: 'James Thompson', scale: '1:43' },
    { make: 'Vauxhall', model: 'Vectra', year: '2000', driver: 'Jason Plato', scale: '1:18' }
];
首先,预先支撑初始的Make选择框:

var makes = get_distinct(vehicles, 'make');
$.each(makes, function(index, value) {
   $('select#make').append('<option value="' + value + '">' + value + '</option>')
});
然后需要更新选择框。您可以通过在每个单独的选择框上定位更改事件来手动执行此操作,但也可以通过将事件附加到所有选择框来动态执行此操作。我更喜欢这种方法,因为它在添加其他字段时不会增加开销

$('select').change(function() {
    // don't execute if this is the last select element
    if ($(this).is(':last')) return;

    // clear all of the following select boxes, leaving a blank option
    $(this).nextAll().html('<option></option>');

    // get list of vehicles filtered by all the previous parameters
    var filtered_vehicles = filter_vehicles();

    // get the next select element
    var next = $(this).next();

    // get the distinct values from our list of filtered vehicles
    var values = get_distinct(filtered_vehicles, next.attr('id'));

    // append our options
    $.each(values, function(index, value) {
        next.append('<option value="' + value + '">' + value + '</option>')
    });
});
总而言之,您将得到如下JSFIDLE:

这在SQL中更容易实现。因此,如果您确实有一个数据库,您将在服务器上执行查询以返回过滤集,这将删除上面一些令人讨厌的代码


我不知道为什么我要手动编写所有这些,因为可能有一个jQuery插件已经做得更好了。但是,嘿,完成了,我玩得很开心,所有的代码都被注释以帮助您学习:

年份、驱动因素和规模的数据是什么样的?没有数据,,很难写出一个解决方案。我将尝试展示我希望如何在框中显示Vauxhall>>Astra>>2002>>James Thompson>>1:43 Vauxhall>>Vectra>>2000>>Jason Plato>>1:18 Ford>>Mondeo>>1998>>Nigel Mansell>>1:43如果你能用这些选项创建选择列表,那就太好了,因为还有很多信息要输入。如果你能告诉我如何布置代码,我会填写其余的信息。这绝对是惊人的!!!非常非常感谢!!!我可以告诉你这里面有很多。我真的很抱歉再问一个问题,但是。。。我正在尝试将javascript放入我已应用模板的页面中。。。预览页面时,选择列表不起作用。是否存在我错误使用的数据无法填充列表的问题?是否有指向该页面的链接?可能是一些事情。使用Firebug或Chrome developer工具检查控制台是否有任何错误,并在整个代码中插入一些console.log以查看是否可以精确定位错误。我通过在答案顶部的JSFIDLE链接的下拉菜单中选择AngularJS 1.0.1复制了我遇到的问题。下拉菜单不会使用javascript中列出的选项填充。然而,显然它在jQuery中工作。有人能帮我让这个特性工作吗?那是因为我编写的代码专门使用jQuery。您可以同时使用angularJS和jQuery。当您更改代码时,请不要拒绝回答;而是发布新的问题。没有人看到它。我为所有的混乱道歉,但我有麻烦让你的代码仍然工作。为了完全确定,您将代码放在何处/如何让网页接受并理解代码,以使其正常工作?它是添加到您希望它工作的页面,还是放在一个单独的文件中并链接到另一个页面?
$('select').change(function() {
    // don't execute if this is the last select element
    if ($(this).is(':last')) return;

    // clear all of the following select boxes, leaving a blank option
    $(this).nextAll().html('<option></option>');

    // get list of vehicles filtered by all the previous parameters
    var filtered_vehicles = filter_vehicles();

    // get the next select element
    var next = $(this).next();

    // get the distinct values from our list of filtered vehicles
    var values = get_distinct(filtered_vehicles, next.attr('id'));

    // append our options
    $.each(values, function(index, value) {
        next.append('<option value="' + value + '">' + value + '</option>')
    });
});