【问题标题】:dynamically add a dropdpwn based on value inserted in autocomplete textbox根据自动完成文本框中插入的值动态添加下拉列表
【发布时间】:2014-10-16 18:23:04
【问题描述】:

请有人帮忙,我真的被困了 2 天:|

我有一个 PHP 表单,我想允许用户按标题或演员选择电影。 所以,我正在考虑这些值(moviebyTitle,moviebyActor)的下拉菜单。为了按标题选择电影,我使用了 jQuery 自动完成功能,它从我的数据库中获取电影标题,它工作正常。

这是我的代码:

<select id="selectType" name="source">
  <option value="">MoviesBy</option>
  <option value="byTitle">byTitle</option>
  <option value="byActor">byActor</option>
</select>

<input type="textbox" name= "tag" id="tags">

<div id="byActor" class="style-sub-1" style="display: none;" name="stylesub1" onchange="ChangeDropdowns(this.value)">
<select name="films[]" multiple="multiple" width="200px" size="10px">
  <?php
   include('moviedropdown.php');
  ?>
 </select>

这里是javascript:

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/minified/jquery-ui.min.css" type="text/css" /> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.1/jquery-ui.min.js"></script>

<script type="text/javascript">
$(document).ready(function () {
    $("#tags").autocomplete({
    source: "actorsauto.php",
    minLength: 2
}); 
 $("#selectType").change(function () {
     if ($(this).val() == "byTitle")
        $("#tags").autocomplete("option", "source", "filmsauto.php");
      else 
      if ($(this).val() == "byActor")
        $("#tags").autocomplete({
         source: "actorsauto.php",
         minLength: 2,
         select: function (event, ui){
           var selectedVal = $(this).val(); //this will be your selected value from autocomplete
          // Here goes your ajax call.
           $.post("actions.php", {q: selectedVal, q2: $("#selectType").val()}, function (response){
            // response variable above will contain the option tags. Simply put in the dropdown.
             $("#movieImdbId").html(response);
          });
      }
    });
  }
});
});                 
</script>

编辑:

这是actions.php:(请参阅上面的javascript部分)

<?php
if(isset($_GET['q']) && !empty($_GET['q']) && isset($_GET['q2']) && !empty($_GET['q2']) ){
   // Here goes the cleaning code. Never use the variables received from $_GET and $_POST directly before processing it for malicious code.
$q = $_GET['q'];
$q2 = $_GET['q2'];

//$sql = fetchResults($q, $q2); // Some function which will run a database query and return some records in either object collection or arrays etc.

//I added this part to fetch data from DB
include('imdbConnection.php');
$sql = $conn->prepare('SELECT DISTINCT movieImdbId FROM movie_roleNames WHERE castName = :q');
$sql->execute(array(':q' => $q));

$html = "";

while($row = $sql->fetchAll(PDO::FETCH_OBJ)){

   $option = '<option value="' . $row->movieImdbId . '">' . $row->movieImdbId . '</option>';

$html = $option;
}
echo $html; // <-- this $html will end up receiving inside that `response` variable in the `$.post` ajax call.
exit;
}
?>

我的问题:

我只是想知道如何根据用户在文本框中输入的值添加下拉列表。例如,如果用户在自动完成文本框中输入“汤姆克鲁斯”,则会添加一个下拉列表,显示播放“汤姆克鲁斯”的电影。 (我在有问题的 JavaScript 代码中做了评论)

我确实搜索了很多,但所有示例都可以动态填充某些下拉列表(like this one,或根据下拉列表中选择的值添加文本框...

请帮忙,我真的不是说有人为我写代码,我只是想找到任何示例或一些我可以学习如何做的方法。

谢谢,

【问题讨论】:

  • 您正在使用mysql_fetch_object 从结果集中获取当前行。但是您正在访问它,就好像它是一个数组一样。要么使用$row-&gt;movieImdbId,要么将mysql_fetch_object 替换为mysql_fetch_array。在您的 javascript 部分,您没有在第一个条件下使用我的 select 回调函数。这两种情况都需要。否则ajax调用不会命中。尝试将它添加到这两个部分,如果你成功了,请告诉我。此外,作为帮助说明,您可以使用浏览器的开发人员工具来查看您的 ajax 调用是否甚至发送到服务器。
  • 如果您使用基于 Mozilla 的浏览器,您可以使用 Firebug 扩展。 Chrome 有一个内置的开发者工具栏。您可以在任何浏览器中使用 F10 访问它。
  • 错字。它不是F10。它的 F12
  • @BasitNizami:感谢您的宝贵时间,我更改了与 t0 mysql_fetch_object 相关的部分。请查看我更新的代码(actions.php)。
  • @BasitNizami:关于您对 javascript 部分的看法,抱歉,请问您为什么要在第一个条件下使用它? (实际上,对于第一个条件“if ($(this).val() == "byTitle")”,它工作正常,我不想在这种情况下填充任何下拉列表(当用户选择电影时标题,自动完成就足够了:p)

标签: javascript php jquery autocomplete


【解决方案1】:

你应该有类似下面的东西。

您真正需要的是,当您在自动完成框中输入内容并选择某些内容时,您需要保留该值以供以后使用。之后,您需要使用 ajax 调用来调用服务器(一个 php 脚本),并从自动完成框中发送该值以及下拉列表中的值(仅当您需要时)。该 php 脚本将需要在循环中生成一堆类似以下内容的内容,并将整个 html 保存在一个变量中。

&lt;option value='v1'&gt;Value1&lt;/option&gt; &lt;option value='v2'&gt;Value2&lt;/option&gt;

之后,将其发送回调用 ajax 脚本,然后您需要将其作为内容放入您尝试填充的下拉列表中。

这里有一些关于如何完成 javascript 部分的示例代码。

<select id="filmsdd" name="films[]" multiple="multiple" width="200px" size="10px">

 </select>
<script>
    $(document).ready(function () {
        $("#tags").autocomplete({
          source: "actorsauto.php",
          minLength: 2,
          select: function (event, ui){
              var selectedVal = $(this).val(); //this will be your selected value from autocomplete
              // Here goes your ajax call.
              $.post("actions.php", {q: selectedVal, q2: $("#selectType").val()}, function (response){
                // response variable above will contain the option tags. Simply put in the dropdown.
                $("#filmsdd").html(response);
              });
          }
        });
    });
<script>

编辑:

path/to/somefile.php 可以是与其他网站文件一起存储在您的目录中的任何文件。我们称之为actions.php(我已经更新了$.post ajax 调用)

$.post 运行时,它会向actions.php 发送一个请求以及两个变量qq2。这些变量名可以是任何名称。

q 包含从自动完成框中选择的值。 q2 包含从下拉列表中选择的类型。

actions.php,你最终会得到这样的结果。

if(isset($_GET['q']) && !empty($_GET['q']) && isset($_GET['q2']) && !empty($_GET['q2']) ){
   // Here goes the cleaning code. Never use the variables received from $_GET and $_POST directly before processing it for malicious code.
$q = $_GET['q'];
$q2 = $_GET['q2'];

$sql = fetchResuls($q, $q2); // Some function which will run a database query and return some records in either object collection or arrays etc.

// Initialize a variable that you will send back to your ajax call, its still waiting for this script to be completed.
$html = "";

// Assuming your function returned a list of objects. Loop through the records.
while($row = mysql_fetch_object($sql)){
   $option = '<option value="' . $row->property_id . '">' . $row->property_name . '</option>';
$html .= $option;
}
echo $html; // <-- this $html will end up receiving inside that `response` variable in the `$.post` ajax call.
exit;
}

我希望这会有所帮助。

【讨论】:

  • 感谢您的回答。抱歉,我对 ajax 很陌生,所以对我来说不是很清楚:|你能告诉我第 11 行的 path/to/somefile.php 中的文件是什么吗?谢谢
  • 对不起,如果我问了一些可能非常简单的问题......我也不明白关于 PHP 脚本的部分,该循环应该将 html 保存在一个变量中(这一行: )
  • 没问题。我将更新我的答案以也反映代码的一些 PHP 方面。
  • 非常感谢您的帮助,我正在尝试您的回答,并会根据结果更新您;)
  • 我会更新我的帖子,这样你就可以看到我做了什么。谢谢
【解决方案2】:

真正的问题是,第二个下拉框有什么意义。一旦他们选择了演员,为什么不将所有电影显示在“表格”中。

我建议使用统一的“搜索”框,在 PHP 端,同时查询您的电影和演员,以这种方式显示所有结果?

如果他们选择了演员类型的自动完成值,则显示演员的所有电影。如果他们选择“电影”类型的自动完成值 - 显示所有电影。

实际上 - 您正在消除按演员或按电影广播,转而使用更好的搜索栏。

【讨论】:

  • @HawHogan :这是我想做的,但我的问题是,如果该值是演员类型,自动完成建议 acors 名称.. 然后应该动态添加一个新的文本框或下拉列表为了放映那个演员的电影!这正是我不知道的一点。我的意思是我不知道如何根据用户在文本框中输入的值动态添加下拉列表(自动完成文本框)
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 2014-03-20
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
相关资源
最近更新 更多