Я пытаюсь создать простой текстовый блок автозаполнения, который принимает предложения из массива. Код, который я использую (на основе этого ):
call.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 и checks.However, он все еще не работает правильно. Фактически я просто обнаружил, что если вы набираете состав букв, которые находятся внутри одного из трех слов, предложения появляются правильно. Это просто не работает, если вы вводите начальные буквы слова. Например, если я даю «com» в качестве ввода, то появляется слово Autocomplete. Однако, если я дам «Aut», тогда ничего. Так что я думаю, что фактическая проблема здесь :
if(**strpos($list[$i], $_GET['str']) !== FALSE** && strlen($_GET['str']) >= 2)
Из того, что я читал здесь, http://php.net/manual/en/function.strpos.php, проблема может быть использована! = Но я использую! == как я должен. Все мысли?
Вам не хватает того, что ваш запрос является асинхронным. Поэтому, когда вы запускаете эту строку: document.getElementById("container").innerHTML = ajax.responseText;
, запрос еще не завершен. Взгляните на это . onreadystatechange
– это то, что вам нужно. Или сделайте этот вызов синхронным
Вы также можете работать так.
Все, что вам нужно, это просто заменить json-массив на php jsonencoding следующим образом:
$list = array( "Autocomplete", "Metapher", "Metatag"); <script> var availableTags = <?php echo json_encode($list) ?> </script>
Надеюсь, это поможет.
Он полностью РАБОТАЕТ!
Я попробовал.
У меня был вход: Met
и это дало мне метафору и еще одно слово.
Однако для расширенного использования. Проверьте это, вам понравится.