我将从头开始。 我正在构建一个双重任务的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脚本中,这很可怕。答案 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请求,并添加一个未考虑到两个请求的随机参数,但是对于每个请求都要相同请求,但每次你去页面时都不一样。这样浏览器将缓存第一个请求,而不是第二次查询服务器,但是当用户再次访问页面时,它不会缓存它。