JQuery自动完成功能在页面刷新和/或随机事件之后才能正常工作

时间:2015-11-05 07:50:52

标签: php jquery ajax autosave

为标题道歉。

我有一个使用两个脚本的页面,它们都在同一个表单上运行。

这是一个自动保存脚本(因为表单上有很多打字,我不希望用户丢失数据)。

<script rel="text/javascript">
    $(function () {
        $.post("autosave.php", "json");
        setInterval(function () {
            $.post("autosave.php", $("form").serialize());
        }, 2000);
    });
</script>

效果很好。 autosave.php只不过是一个简单的数据库查询,它更新了从表单中获取的POST数据中的各个字段。

我还在表单中使用电子邮件字段的自动填充脚本。

<script rel="text/javascript">
    $(function() {
        var availableTags = <?php include('view-job-q-em-search.php'); ?>;
        $("#sendy_to").autocomplete({
            source: availableTags,
            autoFocus:true
        });
    });
</script>

这也很有效,这里的PHP脚本只是一个返回json数组的简单db查询。

然而,他们并没有很好地合作,而且他们做得很好。

有趣的是,如果我将单个字符输入到表单上的一个文本框中,然后刷新,则自动完成开始工作,但是当页面第一次加载时它不会。这就像是等待自动保存在autocompete开始之前执行其第一个动作时一直停滞不前。

我在Jquery中已经足够精通这些东西了,但还不足以发现异常情况,所以任何帮助或想法都可以做到这一点。

我还使用通用外部脚本jquery.min,jquery,ui,这些脚本在<head>

页面的开头加载

2 个答案:

答案 0 :(得分:1)

通过它的外观(并且没有运行太多测试),您将以同步方式运行代码。我的意思是这句话:

var availableTags = <?php include('view-job-q-em-search.php'); ?>;

因为它正在解析PHP脚本而阻止执行其余代码。 您可以使用AJAX来请求标记,而不是包含可用标记的脚本 可用,例如:

var availableTags;
$.get( "tags/getAvailable", function( data ) {
    availableTags = data;
    $("#sendy_to").autocomplete({
        source: availableTags,
        autoFocus:true
    });
});

应该解决这个问题。你能详细说明view-job-q-em-search.php的内容吗?

答案 1 :(得分:0)

好的,这是两件事的组合。首先,你完全正确,呼叫需要同步。

最大的问题...... 因为我每两秒钟就会自动保存一次,所以当我打开表单时,我正在保存一个空白行。然后,自动完成的查询尝试使用空白条目填充json数组,并且它不喜欢它。

解决方法是添加...

$dname_list = array();
while($row = mysqli_fetch_array($result))
{
    if(!empty($row['sent_to'])){
        $dname_list[] = $row['sent_to'];
    }

}
echo json_encode($dname_list);

...将!空子句放入查询中,以便它不会尝试将空行添加到json数组中。