0

我使用通过 Smarty 模板加载的搜索输入字段。Smarty else 包含带有函数的search.js脚本。getmyresult()该函数将输入值传输到 php.ini 中的回调脚本。

我在 Firebug 中没有任何错误,而且一切都非常完美,因为它应该为我做。但在 Firebug 的网络模式下,我没有关于 xhr 的消息。

当行为发生时,控制台向我发送消息

选项 gw_suggest.php 状态 200 OK

而不是$post. 我没有从脚本中得到答案。但是 php 脚本似乎在每个 keyup 事件之后开始。

我通过从 gw_suggest.php 内部设置一个 cookie 来检查这一点,这是我的回调脚本。

出现的问题是,许多使用不同浏览器的用户需要在网页上的链接上的任意位置单击一次。在任意位置单击 1 次后,一切正常。

这是一个已知问题吗?是否有正确方向的解决方案或任何提示?

所以我稍微改变了输入,只有 ID 的名称,但结果相同。这是实际对应的输入字段:

<input id="inputString"  placeholder="..." onkeyup="lookup(this.value)"     
       onfocus="lookup(this.value)" autocomplete="off" size="30">
<div id="resultpanel"></div>

search.js 中加载的内容:

var delay = null;
var XHR = null;
function lookup(inputString) {

    if(delay) clearTimeout(delay);
    if(inputString.length == 0) {
        $('#resultpanel').fadeOut();
    } else {
        delay = setTimeout(function(){

            if(XHR) XHR.abort();
            XHR =$.post("gw_search/gw_suggest.php", { type: "0", lang: "2", term: ""+inputString+""}, function(data) { // JQuery Ajax Call
                $('#resultpanel').fadeIn();
                $('#resultpanel').html(data);
            })
        }, 220);//Delay in Millisec
    }
}

所以也许我可以看到没有错误?

该问题仅在第一次加载页面时发生。就像您重置浏览器时一样。所以外国用户无法搜索数据库。在 DOM 中的任意位置单击任何标签后,xhr 开始完美地完成这项工作。我不明白为什么。对我来说这似乎很神秘,网络上没有人发布相关问题。抱歉,我真的需要更多有 Ajax 经验的人的帮助。这通常不是我的重点。但是整个项目都已截止,只有这个问题会扼杀发布。这是一个真正的问题。

我用萤火虫检查了一切。但是控制台中只有一个 200 OK 消息,每个字母应该通过 XHR 触发 keyup 事件到我的响应 PHP 脚本。回调中似乎没有结果。神秘!

4

1 回答 1

0

我现在能够自己检测并解决问题。在 Firebug 中我发现,只有在第一次加载页面的情况下(如新用户),通过 AJAX 的 POST 和 GET 请求被视为 OPTIONS 请求。

查德克拉克已在以下线程中发布了此问题的修复程序:

https://stackoverflow.com/a/4045448/2263540

看看这个,当必须修复类似描述的行为时。

确实不容易理解为什么同一服务器上的回调脚本受到保护跨站点脚本的技术的保护。

所以这是我放入回调脚本顶行的代码,它解决了我的搜索功能在任何地方都可以工作。

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Max-Age: 1000');
if(array_key_exists('HTTP_ACCESS_CONTROL_REQUEST_HEADERS', $_SERVER)) {
header('Access-Control-Allow-Headers: '
       . $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']);
} else {
header('Access-Control-Allow-Headers: *');
}

if("OPTIONS" == $_SERVER['REQUEST_METHOD']) {
exit(0);
}

感谢乍得克拉克!

于 2013-05-09T17:21:17.590 回答