【问题标题】:ajax autocomplete from array数组中的ajax自动完成
【发布时间】:2012-08-17 20:45:10
【问题描述】:

我正在尝试创建一个简单的自动完成文本框,它从数组中获取建议。我正在使用的代码(基于this)是:

调用.php

<?php
$list = array(
    "Autocomplete",
    "Metapher",
    "Metatag");

for($i=0; $i<count($list); $i++){
    if(strpos($list[$i], $_GET['str']) !== FALSE && strlen($_GET['str']) >= 2){
        echo str_ireplace($_GET['str'], '<b style="color:   red;">'.$_GET['str'].'</b>', $list[$i]) . '<br>';
    }
}

?>

index.php

<!DOCTYPE html>
<html>
    <head>
        <title>AJAX - 03</title>
        <script type="text/javascript">
            var ajax = new XMLHttpRequest;

            function t(){           
                ajax.open("GET", "call.php?str=" + document.getElementById("test").value, false);
                ajax.send();

        ajax.onreadystatechange=function()
        {
          if (ajax.readyState==4 && ajax.status==200)
          {
                document.getElementById("container").innerHTML = ajax.responseText;
          }
       }
    }

        </script>
    </head>

<body>
    <div id="container" style="border: 3px; border-style: solid; font-size: 42pt; border-radius: 7px;">
    Text
    </div>

    <br><br>
    <input id="test" type="text" onkeyup="javascript:t()">
</body>
</html>

但建议框中没有出现任何内容。我找不到任何语法错误,所以我认为逻辑有问题?

更新: 在 PLB 和 FAngel 的建议之后,我添加了 onreadystatechange 和检查。但是它仍然无法正常工作。实际上,我只是发现,如果您键入三个单词之一中的字母组合,建议就会正确出现。如果您输入单词的开头字母,它就不起作用。例如,如果我输入“com”作为输入,则会出现“自动完成”这个词。但是,如果我给出“Aut”则什么都没有。所以我想实际的问题在这里:

if(**strpos($list[$i], $_GET['str']) !== FALSE** && strlen($_GET['str']) >= 2)

从我在这里读到的http://php.net/manual/en/function.strpos.php 来看,问题可能是使用 != 但我应该使用 !==。有什么想法吗?

【问题讨论】:

  • 首先,您必须从浏览器手动检查您的 php。其次,在您的 js 函数中,您应该检查状态:ajax.onreadystatechanged = function() { alert("State: " + ajax.readyState + "; Status: " + ajax.status); } 当状态为 4 且状态为 200 时,一切正常,您可以显示数据。否则出了点问题(检查究竟是什么使用谷歌)。
  • 没有错。你想检查什么?看我的回答。
  • @PLB 你是对的,支票应该在那里。

标签: php ajax autocomplete


【解决方案1】:

它完全有效!

我试过了。

我有输入:Met

它给了我隐喻和另外一个词。

但是,对于高级用法。看看这个,你会喜欢的。

http://jqueryui.com/demos/autocomplete/

【讨论】:

  • 感谢您花时间尝试这个,但我真的必须坚持认为它不起作用。至少不正确,因为一段时间后我意识到有些组合有一些结果,因为它们在中间的单词,然后提出建议。我更新了我的问题来描述这一点。无论如何,非常感谢您的链接,它真的很有帮助!
【解决方案2】:

您错过了您的请求是异步的。所以当你运行这一行时:document.getElementById("container").innerHTML = ajax.responseText;,请求还没有完成。看看thisonreadystatechange 是您所需要的。或者使调用同步

【讨论】:

  • 感谢您的建议,我添加了您的建议。但是,问题似乎出在使用 strpos 的语句上。请检查我的更新。
  • 您对 auto 的输入到底是什么?我已经在我的 PC 上尝试过 - 如果“Aut”中的 A 是大写字母,但小写字母“aut”什么也不返回,则可以正常工作。这是合乎逻辑的,因为strpos 区分大小写,您可能需要改用stripos
  • 是的,你是对的,在添加了 onreadystatechange 和状态检查后,我只尝试了较低的 a。它现在按预期工作。感谢您的帮助!
【解决方案3】:

你也可以这样工作。

http://jsfiddle.net/qz29K/

你只需要像这样用php jsonencoding替换json数组

$list = array(
"Autocomplete",
"Metapher",
"Metatag");

<script>
var availableTags = <?php echo json_encode($list) ?>
</script>

希望这会有所帮助。

【讨论】:

  • 我认为这是做我想做的事的好方法。但是我想问一下,因为我的下一步将使用单独的文件,如果我可以从文件中加载数组用这种方式?
  • 是的,如果您想在加载该文件时将其添加到单独的文件中,您可以执行任何操作,您可以调用相同的函数,您只需加载新的数组并分配给一个 json 编码的变量...
猜你喜欢
  • 1970-01-01
  • 2010-11-02
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
相关资源
最近更新 更多