第一个下拉菜单自动更改第二个下拉菜单的选项

IT技术 php javascript jquery html
2021-01-27 17:09:40

我有两个下拉菜单,其中的选项不是从数据库中获取的。

第一个,让用户选择一个类别。

<select name="category">
    <option value="0">None</option>
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
    <option value="4">Fourth</option>
</select>

第二个选项取决于第一个下拉菜单中的选择。例如,如果用户选择第一个选项,则第二个下拉列表将显示

<select name="items">
    <option value="3">Smartphone</option>
    <option value="8">Charger</option>
</select>

但是当用户改变主意或先选择第二个选项时,第二个下拉列表现在将显示

<select name="items">
    <option value="1">Basketball</option>
    <option value="4">Volleyball</option>
</select>

我的问题是我怎样才能做到这一点?这可以在不使用数据库的情况下完成吗?

谢谢!

6个回答

请参阅下文以查看不使用数据库工作示例

使用 MySQL 数据库的工作示例

如果您想使用数据库连接它,是的,这肯定是可能的。考虑这个表:

CREATE TABLE `contents` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR (255),
    `parent` INT DEFAULT 0
);

INSERT INTO `contents` (`name`, `parent`) VALUES
    ('Names', 0),
    ('Places', 0),
    ('Animals', 0),
    ('Praveen', 1),
    ('Bill Gates', 1),
    ('Steve Jobs', 1),
    ('India', 2),
    ('New York', 2),
    ('London', 2),
    ('Singapore', 2),
    ('Cat', 3),
    ('Dog', 3),
    ('Tiger', 3),
    ('Deer', 3)

表结构

+----+------------+--------+
| id | name       | parent |
+----+------------+--------+
|  1 | Names      |      0 |
|  2 | Places     |      0 |
|  3 | Animals    |      0 |
|  4 | Praveen    |      1 |
|  5 | Bill Gates |      1 |
|  6 | Steve Jobs |      1 |
|  7 | India      |      2 |
|  8 | New York   |      2 |
|  9 | London     |      2 |
| 10 | Singapore  |      2 |
| 11 | Cat        |      3 |
| 12 | Dog        |      3 |
| 13 | Tiger      |      3 |
| 14 | Deer       |      3 |
+----+------------+--------+

初始 HTML 和 PHP 代码

现在,让我们使用 PHP 首先填充初始值<select>

<?php
    mysql_connect();
    mysql_select_db("contents");
    $result = mysql_query("SELECT * FROM `contents` WHERE `parent` = 0");
    while(($data = mysql_fetch_array($result)) !== false)
        echo '<option value="', $data['id'],'">', $data['name'],'</option>'
?>

现在<select>准备好了。使用它的 onchange 函数,我们可以触发一个 AJAX 事件来<select>使用 parent 提供的数据获取新<select>

<select onchange="ajaxfunction(this.value)">
    <!-- Options would have been initially populated here -->
</select>

现在对于 jQuery 函数,您可以这样做:

<script type="text/javascript">
    function ajaxfunction(parent)
    {
        $.ajax({
            url: 'process.php?parent=' + parent;
            success: function(data) {
                $("#sub").html(data);
            }
        });
    }
</script>

在 HTML 中,在 之后<select>,您需要给另一个select带有idas sub

<select onchange="ajaxfunction(this.value)">
    <!-- Options would have been initially populated here -->
</select>
<select id="sub"></select>

处理 PHP 源代码

最后是源代码process.php

<?php
    mysql_connect();
    mysql_select_db("contents");
    $result = mysql_query("SELECT * FROM `contents` WHERE `parent` = " . mysql_real_escape_string($_GET["parent"]));
    while(($data = mysql_fetch_array($result)) !== false)
        echo '<option value="', $data['id'],'">', $data['name'],'</option>'
?>

不使用数据库的工作示例

你只需要在 PHP 中替换它。

<?php
    $parent = array("Name", "Place", "Animals");
    foreach ($parent as $id => $name)
        echo '<option value="s', $id,'">', $name,'</option>'
?>

而对于process.php

<?php
    $parent = array("Name", "Place", "Animals");
    $s0 = array("Praveen", "Bill Gates", "Steve Jobs");
    foreach (${$_GET["parent"]} as $id => $name)
        echo '<option value="', $data['id'],'">', $data['name'],'</option>'
?>
看起来您正在向 process.php 文件发送一个数组。那是对的吗?
2021-03-22 17:09:40
它应该是: '<option value="', $id,'">', $name,'</option>'
2021-03-23 17:09:40
对于 mysql 版本来说真的很方便。谢谢你。
2021-03-31 17:09:40
@Kaoukkos 谢谢,我也包含了数据库较少的版本!!!希望能帮助到你!:)
2021-04-10 17:09:40
我正在尝试使用它,因为它似乎也解决了我的问题。$data在非数据库示例中,定义为什么
2021-04-11 17:09:40

关于数据库的部分不是很清楚,因为选择可能会以某种方式“列出”。如果您有其他格式的它们,这是有道理的,或者如果您询问是否需要回拨到数据库 ( postback),答案是否定的。但不清楚你的意思。

无论如何,您可以使用一个rel=""值(或data-items="")来设置一个选择与另一个之间的关系。

例如:

CSS

.cascade {
    display: none;
}

HTML - 修改

<select name="category">
    <option value="0">None</option>
    <option value="1" rel="accessories">Cellphones</option>
    <option value="2" rel="sports">Sports</option>
    <option value="3" rel="cars">Cars</option>
</select>
<select name="items" class="cascade">
    <option value="3" class="accessories">Smartphone</option>
    <option value="8" class="accessories">Charger</option>
    <option value="1" class="sports">Basketball</option>
    <option value="4" class="sports">Volleyball</option>
    <option value="6" class="cars">Corvette</option>
    <option value="2" class="cars">Monte Carloe</option>
</select>

jQuery

$(document).ready(function(){
    var $cat = $('select[name=category]'),
        $items = $('select[name=items]');

    $cat.change(function(){
        var $this = $(this).find(':selected'),
            rel = $this.attr('rel'),
            $set = $items.find('option.' + rel);

        if ($set.size() < 0) {
            $items.hide();
            return;
        }

        $items.show().find('option').hide();

        $set.show().first().prop('selected', true);
    });
});

http://jsfiddle.net/userdude/bY5LF/

这是另一个例子,基本上所有的数据都在一个对象的页面上,你用它来显示不同的 类别 FIDDLE

var categories = {
    "None":[{value:'3', text:'No cataegory selected'}],
    "First":[{value:'1', text:'Bmw'},{value:'2', text:'Benz'}],
    "Second":[{value:'4', text:'Playstation'},{value:'5', text:'Xbox'},{value:'10', text:'Wii'}],
    "Third":[{value:'6', text:'Dell'},{value:'7', text:'Acer'}],
    "Fourth":[{value:'8', text:'Audi'},{value:'9', text:'Datsun'}]
};
function selectchange(){
    var select = $('[name=items]');
    select.empty();
    $.each(categories[$(':selected', this).text()], function(){
        select.append('<option value="'+this.value+'">'+this.text+'</option>');
    });
}
$(function(){
    $('[name=category]').on('change', selectchange);
});
@Kaoukkos 是的,这很好..也请参阅我的回答,您也可以使用我的技术。
2021-03-19 17:09:40

2 代码的工作演示 :) http://jsfiddle.net/PnSCL/2/ http://jsfiddle.net/PnSCL/

这是可以实现的,但您需要在第一次选择和第二次选择之间建立关系。

请也看看这里:http : //api.jquery.com/data/

label在这里添加了关系http://jsfiddle.net/PnSCL/2/ [ http://www.w3schools.com/tags/tag_option.asp ]

行为当您first从 select1 中选择选项时,它将显示smartphone, chargers否则当用户second从 select1 中选择时,它将显示baskeball, voleyball在 select2 中。

希望这会有所帮助,如果我错过了什么,请告诉我。

演示 1

代码

$("#category").change(function() {
if($(this).data('options') == undefined){
    /*Taking an array of all options-2 and kind of embedding it on the select1*/
    $(this).data('options',$('#select2 option').clone());
    }
var id = $(this).val();
var options = $(this).data('options').filter('[label=' + id + ']');
$('#select2').html(options);
   // alert(options);
});

HTML

<select name="select1" id="category">
    <option value="0">None</option>
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
    <option value="4">Fourth</option>
</select>

<select name="items" id="select2">

    <option value="3" label="1">Smartphone</option>
    <option value="8" label="1">Charger</option>

    <option value="1" label="2">Basketball</option>
    <option value="4" label="2">Volleyball</option>
</select>

演示 2 *代码*

$("#category").change(function() {
if($(this).data('options') == undefined){
    /*Taking an array of all options-2 and kind of embedding it on the select1*/
    $(this).data('options',$('#select2 option').clone());
    }
var id = $(this).val();
var options = $(this).data('options').filter('[value=' + id + ']');
$('#select2').html(options);
    alert(options);
});

HTML

<select name="select1" id="category">
    <option value="0">None</option>
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
    <option value="4">Fourth</option>
</select>

<select name="items" id="select2">

    <option value="1">Smartphone</option>
    <option value="1">Charger</option>

    <option value="2">Basketball</option>
    <option value="2">Volleyball</option>
</select>
嗨,@Kaokkos 生活怎么样?:)是的,你可以,如果它不起作用,请给我一个演示,此外,对于第一个演示,映射在第一个选择1idlabel第二个选择之间。实际上,您可以在 id 和 select2 名称之间进行名称映射。如果我错过了什么,请告诉我,希望这会有所帮助,:)
2021-03-15 17:09:40
万事皆安。我希望你也一样。我的具体意思是,当我选择例如 First form the first dropdown 时,我得到标签的数量而不是选项的名称。
2021-03-28 17:09:40
这次真是万分感谢。关于您的第一个链接jsfiddle.net/PnSCL/2我应该如何列出名称而不是标签编号?
2021-04-03 17:09:40
@Kaoukkos 嘿 Cooleos 人,啊,你的意思是不是id你想要你的name属性?:)只需将选择更改为$("select[name=whatevername]")这样:jsfiddle.net/PnSCL/8 :P
2021-04-03 17:09:40
我询问第一个示例是因为需要第二个下拉菜单的唯一值。
2021-04-13 17:09:40

不使用任何数据库的工作解决方案:

HTML

<select name="country" id="country" onChange="showState();">   
    <option value="">Select Country</option>
    <option value="1">Pakistan</option>
    <option value="2">Saudi Arabia</option>
</select>

<div id="div_state"></div>

查询

<script>
    function showState()
    {
        $('body').css('cursor','wait');
        var value = document.getElementById('country').value;
        var url = 'http://fiddle.jshell.net/rathoreahsan/WcKQ2/4/show/';

        $.ajax({
            type: "GET",
            url: url,
            data:{'country':value},
            success:function(results)
            {              

                $('#div_state').html(results);

                if (value == "1") 
                {
                    $('#PK').css('display','block')                
                } 

                else if (value == "2") 
                {
                    $('#SA').css('display','block')                        
                }

                $('body').css('cursor','default');            

            }
        });
    }
</script>

CSS:

#PK, #SA { display: none; }

看演示 http://jsfiddle.net/rathoreahsan/WyLsh/

状态页面: http : //fiddle.jshell.net/rathoreahsan/WcKQ2/4/show/