php脚本获取两个ajax请求,只返回一个?

时间:2009-06-23 21:30:50

标签: php jquery wordpress plugins asynchronous

我将从头开始。 我正在构建一个双重任务的wordpress插件,因为它可以通过短代码插入到帖子中,或者添加为侧边栏小部件。它只是输出一些js来使jquery.post请求到本地php文件。本地php文件向web服务请求某些数据。 (我必须这样做,而不是直接用jquery.ajax查询web服务,因为url包含一个许可密钥,如果放入js将是公共的。)

无论如何,当我在wordpress博客中查看包含侧边栏小部件和通过短代码插件输出的页面时,只有其中一个请求有效。我的意思是它的工作原理是它从php脚本获得响应。页面加载后,当手动告知时,它们都能正常工作。

网页视图 - >发送2个帖子请求到我的PHP脚本 - >这两个要素都应该归档,但只有一个是。

我的php脚本只是:

<?php
    if(isset($_POST["zip"])) {
         // build a curl object, execute the request, 
         // and basically just echo what the curl request returns.
    }
?>

非常基本。

这里有一些人想看到的:

function widget_getActivities( zip ){
    jQuery("#widget_active_list").text("");
    jQuery.post("http://localhost/wordpress/wp-content/ActiveAjax.php", { zip: zip}, 
        function(text) {
            jQuery(text).find("asset").each(function(j, aval){
                var html = "";
                html += "<a href='" + jQuery(aval).find("trackback").text() + "' target='new'> " +  jQuery(aval).find("assetName").text() + "</a><b> at </b>";

                jQuery("location", aval).each(function(i, val){
                    html += jQuery("locationName", val).text() + " <b> on </b>";
                });

                jQuery("date", aval).each(function(){
                    html += jQuery("startDate", aval).text();
                <!--jQuery("#widget_active_list").append("<div id='ActivityEntry'>" + html + " </div>");-->
                jQuery("#widget_active_list")
                    .append(jQuery("<div>")
                        .addClass("widget_ActivityEntry")
                        .html(html)
                        .bind("mouseenter", function(){
                            jQuery(this).animate({ fontSize: "20px", lineHeight: "1.2em" }, 50);  
                        })
                        .bind("mouseleave", function(){
                            jQuery(this).animate({ fontSize: "10px", lineHeight: "1.2em" }, 50);  
                    })
                    );

                });
            });
        });
}

现在假设有另一个与此相同的功能,除了前面带有'widget_'的所有内容都没有预先添加。这两个函数通过以下方式单独调用:

jQuery(document).ready(function(){
    w_zip = jQuery("#widget_zip").val();
    widget_getActivities( w_zip );
    jQuery("#widget_updateZipLink").click(function() { //start function when any update link is clicked
        widget_c_zip = jQuery("#widget_zip").val();
        if (undefined == widget_c_zip || widget_c_zip == "" || widget_c_zip.length != 5)
            jQuery("#widget_zipError").text("Bad zip code");
        else
            widget_getActivities( widget_c_zip );

    });
})

我可以在我的apache日志中看到两个请求都在进行中。 我猜这是某种竞争条件,但这没有任何意义。 我对这一切都是新手,有什么想法吗?

编辑:我想出了一个次优解决方案。如果插件也在页面上使用,我有我的小部件检测,如果是,它在执行请求之前等待3秒。但我有一种感觉,如果多个客户端同时执行一个页面请求会触发我的php脚本的一个请求,就会发生同样的事情,因为我认为问题出在php脚本中,这很可怕。

1 个答案:

答案 0 :(得分:1)

对我来说真的没有足够的信息可以解决任何问题...

然而,有一件事要尝试获取firebug并查看每个请求的响应。

另一个问题可能是......你是用id填写的吗?如果是这样,那么可能是因为你在一个页面中有两次相同的id,这就是弄乱了。如果你有在线帮助你就会更容易。


编辑:

一些评论......我不确定这有什么事情可以解决......但是......

 <!--jQuery("#widget_active_list").append("<div id='ActivityEntry'>" + html + " </div>");-->

据我所知,您使用的注释类型仅在html中使用时有效,并且可能会搞砸您的Javascript。将其替换为//

jQuery("#widget_active_list").append(jQuery("<div>")
                                     .addClass("widget_ActivityEntry")
                                     .html(html)
                                     .bind("mouseenter", function(){
                                          jQuery(this).animate({ fontSize: "20px", lineHeight: "1.2em" }, 50);  
                                     })
                                     .bind("mouseleave", function(){
                                          jQuery(this).animate({ fontSize: "10px", lineHeight: "1.2em" }, 50);  
                                     })
                             );

其次......整个块都嵌套在最后的.each中,似乎没有效果,但是它并不是不可能的。

最后,虽然它实际上可能没有什么区别,但您可能应该将响应的类型设置为xml。在php中使用http标头并使用函数的最后一个参数。即。

header("Content-Type: application/xml");

jQuery.post("http://localhost/wordpress/wp-content/ActiveAjax.php", { zip: zip}, thefunctionhere, xml);

如果这没有帮助,我对次优解决方案的建议是改为使用get请求,并添加一个未考虑到两个请求的随机参数,但是对于每个请求都要相同请求,但每次你去页面时都不一样。这样浏览器将缓存第一个请求,而不是第二次查询服务器,但是当用户再次访问页面时,它不会缓存它。