更改时重新生成下拉选项

Posted

技术标签:

【中文标题】更改时重新生成下拉选项【英文标题】:On change regenerate a dropdown options 【发布时间】:2018-04-17 09:10:58 【问题描述】:

我有一个下拉列表,当我单击一个选项时,我希望另一个下拉列表从 mysql 重新生成其选项。第一个下拉列表的代码:

    <div class="form-group"> 
    <label class="col-sm-2 control-label" for="input-zone"><?php echo $_['region'];?></label> 
        <div class="col-sm-10"> 
            <select name="region_id" id="region_id" class="form-control">                    
            <?php
            include_once 'config.php';
            mysqli_query($conn,"set names 'utf8'");
            $sql = "SELECT * FROM region";
            $result = mysqli_query($conn, $sql);
            $url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 
            while ($row = mysqli_fetch_array($result)) 
                if ((strpos($url,'/gr/') == true)) 
                    $perioxi = $row['region_greek'];
                 else 
                    $perioxi = $row['region_english'];
                
                echo "<option value='" . $row['region_id'] ."'>" . $perioxi . "</option>";
            
            ?>
            </select>
        </div> 
        <span class="error"><?php echo $option_value_error ?></span>
    </div> 

它从 mysql 中获取数据并生成下拉列表。 第二个下拉列表在它下面,它与第一个类似,而是我更改了查询,我希望查询是这样的

$sql = "SELECT * FROM region_prefecture WHERE region_id = '14'";

region_id 是 sql 中的列,也是选项值。 所以问题是,当我单击第一个下拉列表时,例如值 3,我希望第二个下拉列表更新来自 mysql 的数据,列 region_id 为 3。

我知道我必须使用 javascript onchange 函数,但我不知道如何更新它。

仅供参考:新用户注册时与 opencart 使用的相同。 Opencart 使用完全相同的国家选择,然后在另一个下拉列表中生成城市。

【问题讨论】:

实现这一目标是一条漫长但并不复杂的道路,当然有很多方法可以做到。一个非常通用的建议:在您的站点上创建以 JSON 格式生成下拉数据的端点(使用您喜欢的任何方式、多个地址或一个根据收到的 POSTGET 请求),然后在客户端发生下拉更新事件时使用 AJAX 向您的站点查询此数据。您可以(并且应该)重用数据库访问代码来生成一组数据,您可以从中轻松地生成 html(最初)或 JSON。 由于这个答案太宽泛了,它可能会被关闭。但我敢肯定,使用您最喜欢的搜索引擎将为您提供许多关于术语 “dropdown json ajax” 的结果和示例。 【参考方案1】:

你必须使用 jquery on change 和 ajax 来实现你想要的。

<script>
 $(document).on("change","#region_id",function()
  //$.ajax request, target.php is your php code that returns new option
  $.ajax(
   url: "target.php", //target.php should contain $_POST['id'], and a that would act as a return
   method: "POST",
   data: 
    id: $("#region_id").val() //get current value of region_id and send it to target.php
   ,
   dataType: "text",
   success: function(data) 
    //if target.php is reached and returned data,
    //replace the option tags of prefecture_id select element
    $("#prefecture_id").html(data); //data is list of option tags returned by target.php
   
  );
 );
</script>

【讨论】:

target.php 应该有什么代码?从头开始生成第二个下拉列表的那个? target.php 应该有 1) php 代码来接收 post 值; $_POST['id']、2) 数据库查询(如果需要)、3) 和回显 $result the echo serves as the return statement, this will be stored to the data variable of ajax on success event 当我测试它时,我看到它使用我想要的数据创建了一个新的下拉列表,但它不会重新生成我想要的 Dropbox。我试图改变 $("form").append("");到表单名称,但它没有做任何事情,我将其更改为 $("prefecture_id").append(""); @AntonisPsaroulakis 不要忘记 ID 的 # 符号。 $("#prefecture_id")。在您的代码中,prefecture_id 是 还是 太棒了!它正是我想要的!顺便说一句,它是一个选择元素。

以上是关于更改时重新生成下拉选项的主要内容,如果未能解决你的问题,请参考以下文章

反应只重新渲染一个孩子

属性更改时如何重新渲染反应组件

根据下拉更改绑定/重新绑定 Kendo Grid

(重新)在更改事件处理程序中渲染主干视图不起作用

重新加载后设置 jplist-drop-down 的值

重新计算更改时选择选项的总和