0

我需要 onkeyup 多次触发,但它似乎只触发一次!

当我在输入框中输入内容时,它会搜索,但是每当我退格并搜索其他内容时,div 保持不变..

这是我的代码:

<script type="text/javascript">
function suggest1() {
    var dam_text = document.getElementById('dam').value;

    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject('MicrosoftXMLHTTP');
    }
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            document.getElementById('myDiv').innerHTML = xmlhttp.responseText;
        }
    }
    var target = 'dam_search.php?dam_text=' + dam_text;
    xmlhttp.open('GET', target, true);
    xmlhttp.send();
}
</script>

<input type="text" name="dam" id="dam" onkeyup="suggest1();"><br />
<div id="myDiv"></div>

这是dam_search.php

<?php

//connect to db stuff here

if (isset($_GET['dam_text'])) {
    $dam = $_GET['dam_text'];
    getSuggest($text);
}

function getSuggest($text) {

    $sqlCommand = "SELECT `name` FROM `table1` WHERE `name` LIKE '%$dam_text%'";

    $query = mysql_query($sqlCommand);

    $result_count = mysql_num_rows($query);

    while ($row = mysql_fetch_assoc($query)) {
        echo $row['name'].'<br />';
    }

}
?>

另外:我想知道如何将搜索到的名称的返回值放入输入框的下拉列表中,而不是放入 div 中,因此当我单击其中一个名称时,它会自动填充输入框。

谢谢!

4

3 回答 3

0

OnKeyUp 每个事件只会触发一次。按 'A' 'B' 和 'C' 将导致对建议 1() 的三个调用;

为确保您的浏览器正常工作,请尝试此操作

 <script type="text/javascript">
 function suggest1() {
     document.getElementById('myDiv').innerHTML = document.getElementById('dam').value;
 }
 </script>
 <input type="text" name="dam" id="dam" onkeyup="suggest1();"><br />
 <div id="myDiv"></div>

您应该看到输入中发生的每次击键的 div 更改。

我有两个未知数可以直接指出您的实际问题。对于零条目查询,您的 PHP 将不输出任何内容,并且如果您查询 LIKE 仅匹配一件事,则只会输出 1 个项目。我认为您的问题出在其他地方,而不是 onkeyup

在您的系统/浏览器上对 onkeyup 进行 T 测试:尝试echo strlen($text).'<br />';在 PHP 文件中添加一些调试标头。您应该会看到数字的变化,而无需依赖 SQL 查询来添加或删除文本(包括退格键)的每次按键。

你的代码看起来不错。并且使用http://ivanzuzak.info/urlecho/上的公共 HTTP GET 回显服务对我来说运行良好

将您的 PHP 换成 echo 服务可以正常工作(有一点打字延迟)

<script type="text/javascript">
function suggest1() {
    var dam_text = document.getElementById('dam').value;

    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject('MicrosoftXMLHTTP');
    }
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            document.getElementById('myDiv').innerHTML = xmlhttp.responseText;
        }
    }
    var target = 'http://urlecho.appspot.com/echo?body=' + dam_text;
    xmlhttp.open('GET', target, true);
    xmlhttp.send();
}
</script>

<input type="text" name="dam" id="dam" onkeyup="suggest1();"><br />
<div id="myDiv"></div>
于 2013-10-12T19:08:59.770 回答
0

仍然不确定您的 keyup 问题仅在每次页面加载时触发一次。在没有看到更多代码的情况下很难合理地推测。尽管如此,这里有一个我刚刚汇总的示例,说明如何以更有用的方式呈现返回的数据。

该代码要求您下载我在之前的评论中提到的 AjaxRequest 库。( http://ajaxtoolbox.com/request/ )

在这里,我演示几个原则。

  1. 将数据排列到 php 类中
  2. 构造此类的实例数组
  3. 将此数组作为 JSON 返回
  4. 捕获 JSON 文本并将其转换回 JS 中的对象
  5. 处理数据

我给出了 2 个非常简单的示例 - 第一个简单地将当前目录(包含 jsonDir.php)中的所有文件名加载到一个选择元素中。选择文件名会导致将其复制到按钮旁边的文本输入中。

第二,只检索 png 文件的名称。它也将它们全部放入一个选择元素中。然而,这一次,当一个项目被选中时,它被用作图像的 src。在每种情况下,只有当/当相应的按钮被按下时才会抓取文件名。有一些多余的/否则很糟糕的代码我本可以做得更好,但是醒了 20 个小时后,我准备睡觉了!

代码预览图

希望它对你有用。有任何问题,尽管问。:)

1.json目录.php

<?php
class mFile
{
    public $name, $time, $size;
}

if (!isset($_GET['wildcard']))
    $wildCard = "*.*";
else
    $wildCard = $_GET['wildcard'];

foreach (glob($wildCard) as $curFilename)
{
    $curFileObj = new mFile;
    $curFileObj->name = $curFilename;
    $curFileObj->time = date("d/m/Y - H:i", filectime($curFilename));
    $curFileObj->size = filesize($curFilename);
    $fileArray[] = $curFileObj;
}
printf("%s", json_encode($fileArray));
?> 

2.readDir.html

<!DOCTYPE html>
<html>
<head>
<script type='text/javascript' src='script/ajaxRequestCompressed.js'></script>
<script>
function byId(e){return document.getElementById(e);}
function newEl(tag){return document.createElement(tag);}

function myGetAjaxResponseWithCallback(url, target, callbackFunc)
{
  AjaxRequest.get(
    {
      'url':url,
      'onSuccess':function(req){ callbackFunc(req.responseText, target); }
    }
  );
}

function getResults1()
{
    var url = "jsonDir.php";
    var target = byId('resultsDiv');
    myGetAjaxResponseWithCallback(url, target, jsonDataReceived1);
}

function getResults2()
{
    var url = "jsonDir.php?wildcard=*.png";
    var target = byId('resultsDiv2');
    myGetAjaxResponseWithCallback(url, target, jsonDataReceived2);
}

function jsonDataReceived1(responseText, targetContainer)
{
    var resultObject = JSON.parse(responseText);
    targetContainer.innerHTML = "";

    var mStr = "There were " + resultObject.length + " records returned" + "<br>";
    var mSel = newEl("select");

    mSel.addEventListener('change', doAutofill, false);

    var i, n = resultObject.length;
    for (i=0; i<n; i++)
    {
        var curRecordOption = new Option(resultObject[i].name, i);
        mSel.appendChild(curRecordOption);
    }
    targetContainer.innerHTML = mStr;
    targetContainer.appendChild(mSel);
}

function jsonDataReceived2(responseText, targetContainer)
{
    var resultObject = JSON.parse(responseText);
    targetContainer.innerHTML = "";

    var mSel = newEl("select");
    mSel.addEventListener('change', showSelectedImg, false);

    var i, n = resultObject.length;
    for (i=0; i<n; i++)
    {
        var curRecordOption = new Option(resultObject[i].name, i);
        mSel.appendChild(curRecordOption);
    }
    targetContainer.innerHTML = '';
    targetContainer.appendChild(mSel);
}


function doAutofill(e)
{
    var curSelIndex = this.value;
    var curText = this.options[curSelIndex].label;
    byId('autofillMe').value = curText;
}

function showSelectedImg(e)
{
    byId('previewImg').src = this.options[this.value].label;
}

</script>
<style>
img
{
    border: solid 2px #333;
}
</style>
</head>
<body>
    <button onclick='getResults1()'>Get *.* dir listing</button> <input id='autofillMe'/>
    <div id='resultsDiv'></div>
    <hr>
    <button onclick='getResults2()'>Get *.png dir listing</button> <img id='previewImg' width='100' height='100'/>
    <div id='resultsDiv2'></div>
</body>
</html>
于 2013-10-12T22:46:27.980 回答
0

发现了我的问题。查询未正确处理!

我将变量 $dam_text 作为 LIKE 语句,而它应该是 $dam:

<?php

//connect to db stuff here

if (isset($_GET['dam_text'])) {
    $dam = $_GET['dam_text'];
    getSuggest($text);
}

function getSuggest($text) {

    $sqlCommand = "SELECT `name` FROM `table1` WHERE `name` LIKE '%$dam_text%'";

    $query = mysql_query($sqlCommand);

    $result_count = mysql_num_rows($query);

    while ($row = mysql_fetch_assoc($query)) {
        echo $row['name'].'<br />';
    }

}
?>

此外,变量 $dam 没有在函数内提交,所以我将它从“if”语句移到函数中:

<?php

//connect to db stuff here

if (isset($_GET['dam_text'])) {
    getSuggest($text);
}

function getSuggest($text) {

    $dam = $_GET['dam_text'];

    $sqlCommand = "SELECT `name` FROM `table1` WHERE `name` LIKE '%$dam%'";

    $query = mysql_query($sqlCommand);

    $result_count = mysql_num_rows($query);

    while ($row = mysql_fetch_assoc($query)) {
        echo $row['name'].'<br />';
    }

}
?>

上面的代码完美运行!原来它毕竟不是onkeyup!感谢你的帮助!

于 2013-10-13T05:41:44.213 回答