Jquery UI Autocomplete - 从外部源绘制数据时如何使用 Accent Mapping

Posted

技术标签:

【中文标题】Jquery UI Autocomplete - 从外部源绘制数据时如何使用 Accent Mapping【英文标题】:Jquery UI Autocomplete - how to use Accent Mapping when drawing data from external source 【发布时间】:2021-11-08 08:15:04 【问题描述】:

我的网站上有一个搜索表单,其中 JQuery UI 自动完成功能可以找到匹配的名称。我很快就发现了重音名称的问题(如 Jörn Zaefferer),并在 JQuery UI 文档中找到了以下解决方案。

$(function() 
  var accentMap = 
    "á": "a",
    "ö": "o",
     "ü": "u"
  ;

  var normalize = function(term) 
    var ret = "";
    for (var i = 0; i < term.length; i++) 
      ret += accentMap[term.charAt(i)] || term.charAt(i);
    
    return ret;
  ;

  $("#developer").autocomplete(
    source: function(request, response) 
      $.getJSON("getData.php", 
        term: normalize(request.term)
      , function(results) 
        response(results);
      )
    
  );
);
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

   <head>
      <meta charset = "utf-8">
      <title>jQuery UI Autocomplete functionality</title>
     <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

   </head>
<body>
    <div class="ui-widget">
        <form>
            <label for="developer">Developer: </label>
            <input id="developer">
        </form>
</div>
</body>
</html>`

在这个简单的示例中,数据(变量名称)保存在脚本中,但我希望能够从外部文件中提取类似的数据。我可以使用不同的脚本(使用源代码:getData.php)但没有 Accent Mapping 来做到这一点。我不确定如何将两者集成在一起,以便我可以对来自外部文件的数据进行重点映射。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

考虑一个小改动。而不是使用$.grep(),您只需将未重音的术语发送到您的 PHP 脚本。结果将发送到您的响应。

$(function() 
  var accentMap = 
    "á": "a",
    "ö": "o"
  ;

  var normalize = function(term) 
    var ret = "";
    for (var i = 0; i < term.length; i++) 
      ret += accentMap[term.charAt(i)] || term.charAt(i);
    
    return ret;
  ;

  $("#developer").autocomplete(
    source: function(request, response) 
      $.getJSON("getData.php", 
        term: normalize(request.term)
      , function(results) 
        response(results);
      )
    
  );
);
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<div class="ui-widget">
  <form>
    <label for="developer">Developer: </label>
    <input id="developer">
  </form>
</div>

因此,如果用户输入“Jö”,脚本会将“jo”发送到 getData.php,并将获得一组结果,其中包括“Jörn Zaefferer”。

使用 PHP 更新

您表示您的 PHP 正在使用以下代码。

<?php
$term = $_GET[ "term" ];
$singers = array(
  array(
    "label" => "Skelton, Stuart / singer", 
    "value" => "Skelton, Stuart / singer"
  ),
  array(
    "label" => "Groissböck , Günther / singer",
    "value" => "Groissböck , Günther / singer"
  )
); 
$result = array(); 
foreach($singers as $singer) 
  $singerLabel = $singer[ "label" ]; 
  if ( strpos( strtoupper($singerLabel), strtoupper($term) ) !== false )  
    array_push( $result, $singer ); 
   
 
echo json_encode( $result );
?>

如果用户输入“gr”,javascript 会将其规范化为“gr”并发出 GET 请求。 PHP 将接受请求,$term 的值为 "gr"

首先,为了您的比较,我会使用stripos()

stripos — 查找字符串中不区分大小写的子字符串第一次出现的位置

我们需要确定$term 是否是任何标签的一部分。标签应该标准化。在这个测试用例中,没关系。

$result = array(); 
foreach($singers as $singer) 
  if (stripos($singer['label'], $term) !== false)  
    $result[] = $singer;
    /* Note: If you use array_push() to add one element to the array, it's better to use $array[] = because in that way there is no overhead of calling a function. */
   

header('Content-Type: application/json; charset=utf-8');
echo json_encode($result);

考虑规范化您的标签。完整示例 PHP 代码:

<?php
$term = $_GET[ "term" ];
$singers = array(
    array(
        "label" => "Skelton, Stuart / singer", 
        "value" => "Skelton, Stuart / singer"
    ),
    array(
        "label" => "Groissbock , Gunther / singer",
        "value" => "Groissböck , Günther / singer"
    )
); 
$result = array(); 
foreach($singers as $singer) 
    if (stripos($singer['label'], $term) !== false)  
        $result[] = $singer;
     

header('Content-Type: application/json; charset=utf-8');
echo json_encode($result);
?>

【讨论】:

感谢@Twisty 从 getData.php 文件中提取并找到匹配项的响应,但不幸的是没有找到带有重音符号的名称。我已将 getData.php 文件定义如下: $term = $_GET[ "term" ]; $singers = 数组(数组(“标签”=>“斯凯尔顿,斯图尔特/歌手”,“价值”=>“斯凯尔顿,斯图尔特/歌手”),数组(“标签”=>“Groissböck,Günther/歌手”,“ value" => "Groissböck , Günther / 歌手" )); $结果 = 数组(); foreach ($singers as $singer) $singerLabel = $singer[ "label" ]; if ( strpos( strtoupper($singerLabel), strtoupper($term) )!== false ) array_push( $result, $singer ); echo json_encode( $result ); 使用这个数据找到了 Skelton,但在输入 gr 时没有找到 Groissböck。这是定义数据的正确方法还是有更简单/更好的方法?谢谢 感谢您的详细回复和建议。不幸的是,您之前建议的 JQuery 脚本和上面的规范化 PHP 我仍然无法正常工作。 sk 找到 Skelton,但 gr 没有找到 Groissbock。如果我添加第三个名称(Lundgren、Stewart),那么 st 会找到 Skelton 和 Lundgren,但 gr 仍然什么也找不到(除了 Groissbock 之外,它还应该找到 Lundgren)。 虽然我主要关心的是让它发挥作用,但我想知道您为什么建议对标签进行规范化? “标签”条目用于显示在下拉列表中,而“值”条目返回到搜索框。从用户的角度来看,重音应该在两者中,以便始终正确显示名称。

以上是关于Jquery UI Autocomplete - 从外部源绘制数据时如何使用 Accent Mapping的主要内容,如果未能解决你的问题,请参考以下文章

JQuery UI之Autocomplete

jQuery UI 实例 - 自动完成(Autocomplete)

Jquery Ui AutoComplete自动填写的功能

07 Jquery UI Autocomplete 自动补全插件

JQuery UI之Autocomplete

jquery UI autocomplete 提示下拉