【问题标题】:not displaying selected options in drop down menu不在下拉菜单中显示选定的选项
【发布时间】:2012-12-16 06:27:55
【问题描述】:

下面我有一段代码,它假设显示 2 个下拉菜单,一个用于建筑,另一个用于房间。发生的情况是,当用户从建筑物下拉菜单中选择建筑物时,使用 ajax/jquery 它将导航到 room.php 页面并列出属于所选建筑物的房间并在房间下拉菜单中显示房间列表下菜单。这工作正常:

<script type="text/javascript">

    function getRooms() { 
    var building = jQuery("#buildingsDrop").val(); 
    jQuery('#roomsDrop').empty(); 
    jQuery('#roomsDrop').html('<option value="">Please Select</option>'); 
    jQuery.ajax({ 
          type: "post", 
          url:  "room.php", 
          data: { building:building }, 
          success: function(response){ 
              jQuery('#roomsDrop').append(response); 
          } 
        }); 


 }

</script>

...

<?php

 $sql = "SELECT DISTINCT Building FROM Room"; 

 $sqlstmt=$mysqli->prepare($sql);

 $sqlstmt->execute(); 

 $sqlstmt->bind_result($dbBuilding);

 $buildings = array(); // easier if you don't use generic names for data 

 $buildingHTML = "";  
 $buildingHTML .= '<select name="buildings" id="buildingsDrop" onchange="getRooms();">'.PHP_EOL; 
 $buildingHTML .= '<option value="">Please Select</option>'.PHP_EOL;  

 while($sqlstmt->fetch()) 
 { 
     $building = $dbBuilding; 
     $buildingHTML .= "<option value='".$building."'>" . $building . "</option>".PHP_EOL;  
  } 

  $buildingHTML .= '</select>'; 

  $roomHTML = "";  
  $roomHTML .= '<select name="rooms" id="roomsDrop">'.PHP_EOL; 
  $roomHTML .= '<option value="">Please Select</option>'.PHP_EOL;  
  $roomHTML .= '</select>'; 

?>

room.php:

$building = isset($_POST['building']) ? $_POST['building'] : '';

$sql = "SELECT Room FROM Room WHERE Building = ?";
$sqlstmt=$mysqli->prepare($sql);
$sqlstmt->bind_param("s",$building);
$sqlstmt->execute();
$sqlstmt->bind_result($dbRoom);

$roomHTML  = "";

while($sqlstmt->fetch()) {
    $roomHTML .= "<option value='".$dbRoom."'>" . $dbRoom . "</option>".PHP_EOL;
}
echo $roomHTML;

我遇到的问题是,当用户选择评估时,假设在相关下拉菜单中显示评估的建筑物和房间选项。但它没有选择这些选项,它们仍然保留在“请选择”选项上。为什么会这样?如何获得显示的选项?

下面是查看源码:

    //Assessment drop down menu:

    <p><strong>Assessments:</strong> <select name="session" id="sessionsDrop">
    <option value="">Please Select</option>
    <option value='71' style='color: green'>AKXMB - 30-11-2012 - 10:00</option>
    </select> </p>   
    </form>

    //Building drop down menu:

    <select name="buildings" id="buildingsDrop" onchange="getRooms();">
    <option value="">Please Select</option>
    <option value='Canalside East'>Canalside East</option>
    <option value='Canalside West'>Canalside West</option>
    </select>


    //Room drop down menu (list of rooms displayed in room.php):

    <select name="rooms" id="roomsDrop">
    <option value="">Please Select</option>
    </select>

    //Retrieve assessment information 
    //(Below is where problem lies where it is not selecting building and room options in drop down menu)
    <script type="text/javascript">

$(document).ready( function(){

                var sessioninfo = [{"SessionId":71,"Building":"Canalside East","Room":"CE01\/04"},{"SessionId":84,"Building":"Canalside East","Room":"CE01\/04"}];

                $('#sessionsDrop').change( function(){

                    var sessionId = $(this).val();

                    if (sessionId !== '') {
                for (var i = 0, l = sessioninfo.length; i < l; i++)
                {
                        if (sessioninfo[i].SessionId == sessionId) { 

                var currentbuilding = $('#currentBuilding').val(sessioninfo[i].Building);
                var editbuilding = $('#BuildingsDrop').val(sessioninfo[i].Building);
                var currentroom = $('#currentRoom').val(sessioninfo[i].Room);
                var editroom = $('#RoomsDrop').val(sessioninfo[i].Room);
                var currentid = $('#currentId').val(sessioninfo[i].SessionId);
                var editid = $('#newId').val(sessioninfo[i].SessionId);

                        break;
                }
               }
             }

                });
            });
</script>

更新:

Application

  • 在应用程序中,从下拉菜单中选择“模块”并提交。

  • 下面应该显示一些功能。在评估下拉菜单中 选择任何评估。

  • 您可以在“当前评估详细信息”下方看到它 在只读文本输入中显示建筑物和房间 指出评估的当前建筑物和房间是什么。

  • 我想在下拉菜单中选择相同的建筑物和房间 “新评估室”部分中的菜单。你可以看到 在建筑物下拉菜单中选择了建筑物,但房间是 未在“房间”下拉菜单中选择。

【问题讨论】:

    标签: php jquery mysqli


    【解决方案1】:

    除非这是复制/粘贴错误,否则您的评估函数/脚本周围缺少 &lt;script&gt;&lt;/script&gt; 标签 -

    <script type="text/javascript">
    $(document).ready( function(){
    
    ...
        });
    </script>
    

    编辑

    您的问题是您的 id 的大小写错误 -

            ...
            var editbuilding = $('#BuildingsDrop').val(sessioninfo[i].Building);
            ...
            var editroom = $('#RoomsDrop').val(sessioninfo[i].Room);
    

    改为-

            ...
            var editbuilding = $('#buildingsDrop').val(sessioninfo[i].Building);
            ...
            var editroom = $('#roomsDrop').val(sessioninfo[i].Room);
    

    另见 - In the DOM are node ids case sensititve?

    编辑 - 2
    只需在var editroom 之前添加getRooms() 即可填充#roomsDrop,这样您就可以设置所选内容了。

    var currentbuilding = $('#currentBuilding').val(sessioninfo[i].Building);
    var editbuilding = $('#buildingsDrop').val(sessioninfo[i].Building);
    var currentroom = $('#currentRoom').val(sessioninfo[i].Room);
    getRooms();
    var editroom = $('#roomsDrop').val(sessioninfo[i].Room);
    var currentid = $('#currentId').val(sessioninfo[i].SessionId);
    var editid = $('#newId').val(sessioninfo[i].SessionId);
    

    编辑 - 3

    默认情况下,$.ajax 在浏览器中异步运行,所以问题是在您到达 function getRooms() 中的 success: function(response){} 之前,它已经移动到 var editroom = $('#roomsDrop').val(sessioninfo[i].Room);,并且由于 jQuery('#roomsDrop').append(response); 没有附加roomsDrop 的选项值没有可供选择。这可以通过两种方式解决 -

    (1) 使用async: false快速修复

    <script type="text/javascript">
        function getRooms() { 
        var building = jQuery("#buildingsDrop").val(); 
        jQuery('#roomsDrop').empty(); 
        jQuery('#roomsDrop').html('<option value="">Please Select</option>'); 
        jQuery.ajax({ 
              type: "post", 
              url:  "room.php", 
              data: { building:building },
              async: false, 
              success: function(response){ 
                  jQuery('#roomsDrop').append(response); 
              } 
            }); 
     }
    </script>
    

    这使得$.ajax 同步调用,所以在success: function(response){} 完成之前它不会继续到var editroom = $('#roomsDrop').val(sessioninfo[i].Room);注意请注意,async: false 在等待响应时会冻结浏览器,因此它可能会阻止任何其他操作。

    (2)使用回调函数-

    <script type="text/javascript">
        function getRooms(callback) { 
        var building = jQuery("#buildingsDrop").val(); 
        jQuery('#roomsDrop').empty(); 
        jQuery('#roomsDrop').html('<option value="">Please Select</option>'); 
        jQuery.ajax({ 
              type: "post", 
              url:  "room.php", 
              data: { building:building },
              async: false, 
              success: function(response){ 
                  jQuery('#roomsDrop').append(response);
                  callback();
              } 
            }); 
     }
    </script>    
    

    getRooms(function(){
    var editroom = $('#roomsDrop').val(sessioninfo[i].Room);});
    

    此回调函数将在getRooms() 完成后执行var editroom = $('#roomsDrop').val(sessioninfo[i].Room);,但将继续执行script 的其余部分,而无需打开浏览器

    【讨论】:

    • 对不起,肖恩,这是一个复制和粘贴错误,我的应用程序中有标签
    • 我已经更新了我的答案。显然你有你的id's for buildingsDrop & roomsDrop 有错误的情况(BuildingsDrop / RoomsDrop
    • 我错过了这个是个傻瓜。好的,正在发生的事情是正在选择建筑物,但房间仍在使用中,请选择,但下拉菜单中没有显示房间选项。我是否需要在 juqery 代码中的某处包含 getRooms() 函数?
    • 由于#roomsDrop 为空,所以在你想设置所选值之前调用getRooms()(但在你调用var editbuilding = $('#buildingsDrop').val(sessioninfo[i].Building); 之后)。我已将其添加到我的答案中。
    • 如果我选择一个评估会发生什么,它会在建筑物下拉列表中显示建筑物列表,并在下拉列表中选择当前评估建筑物,这很好。对于房间下拉菜单,它显示属于所选建筑物的房间列表,但它不显示从所选评估中选择的房间选项,它仍然在房间下拉菜单中显示Please Select 选项。我赞成你的回答。我将在我的问题中提供更新,为您提供应用程序的链接。
    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2014-09-28
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多