我正在尝试使用这个AJAX请求来调用一些正常工作的PHP文件和一些不能正常工作的JavaScript。任何想法?
function showpart2(){
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","atuamae.org/parte2-encomendar.php",false);
xmlhttp.send(null);
}
document.getElementById('part2').innerHTML = xmlhttp.responseText;
eval(xmlhttp.responseText.getElementById('part2').innerHTML)
setTimeout('showpart2()',15000);
}
showpart2();
答案 0 :(得分:0)
您需要实际评估JS标记(手动,通过eval
或通过DOM插入)。像jQuery这样的库会为你做这个,但是如果你需要使用自定义解决方案,你也需要添加它。
答案 1 :(得分:0)
你写道:
xmlhttp.responseText.getElementById( '第2部分')
responseText是一个字符串,不会有任何getElementById方法。 您要么使用xmlhttp.responseXML.getElementById(“part2”),要么使用字符串方法来提取第二部分。
答案 2 :(得分:0)
像Adam Rackis一样,我建议你使用$ .ajax真的很容易尝试它.....但如果它不适合你,这里是一个函数,用于在进行ajax调用时使用,并在IE和Firefox中工作,Chrome如果你不能使用Jquery,我建议你。 您的函数中的问题在IE中不起作用,因为它没有xmlhttprequest对象。 希望这会对你有所帮助。
function newAjaxObject()
{
var oHttp=false;
var asParsers=[
"Msxml2.XMLHTTP.5.0",
"Msxml2.XMLHTTP.4.0",
"Msxml2.XMLHTTP.3.0",
"Msxml2.XMLHTTP",
"Microsoft.XMLHTTP"
];
if ( !oHttp && typeof XMLHttpRequest != 'undefined')
{
oHttp=new XMLHttpRequest();
}
if( !oHttp){
for (var iCont=0; !oHttp && iCont < asParsers.length; iCont++)
{
try
{
oHttp=new ActiveXObject(asParsers[iCont]);
}
catch(e)
{
oHttp=false;
}
}
}
return oHttp;
}
答案 3 :(得分:0)
示例代码的一个大问题是使XMLHttpRequest.send
同步意味着所有JS执行必须在等待接收请求时暂停。没有理由不使用异步调用。
异步调用可以提高响应能力,但是他们没有给你的是协调,这意味着任务在它需要的数据准备好之前不会运行。协调异步代码的标准方法是将一个函数传递给异步函数,该函数在执行时执行依赖于数据的其余计算。此函数的技术名称为“continuation”,它只是一个函数,表示从给定点开始的其余计算。也就是说,转:
f1();
f2();
async();
f3();
f4();
成:
f1();
f2();
async(function() {
f3();
f4();
});
因为你传递了一个延续,这被称为“延续传递风格”。 XMLHttpRequest是一种特殊情况,它不是将函数传递给异步函数,而是将其设置为XHR对象上readystatechange
事件的侦听器。也就是说,您将延续分配给xmlhttp.onreadystatechange
。
还有一些改进。首先,添加错误检测。 XHR实例的status
属性保存HTTP状态,您可以使用它来检查错误。
正如其他一些人所提到的那样,eval
可能会有问题,如果有其他选择,应该避免使用eval
。首先,您必须确保字符串来自可信来源。这里eval
的特殊问题是脚本在与eval
的调用相同的上下文中进行评估。如果eval
发生在函数内部,则脚本定义的任何内容在函数外部都不可见。如果您的脚本不需要定义任何内容(并且永远不需要定义任何内容;始终考虑代码的未来),则可以使用globaleval
。否则,动态创建一个脚本元素,并将脚本作为内容添加到文档中;您可以定义执行此操作的函数(请参阅下面示例中的xmlhttp
)。
setTimeout
是一个global变量,这很糟糕。相反,将其声明为局部变量。
而不是用于一次性调用的setTimeout
,而是使用setInterval
,它会定期调用传递的函数。请注意,setInterval
和(function () {
// keep variable from polluting global namespace
var showpart2Interval = 0,
scriptElt = {parentNode: {removeChild: function() {}}};
function globaleval(script) {
scriptElt.parentNode.removeChild(scriptElt);
scriptElt = document.createElement('script');
scriptElt.type = 'text/javascript'
scriptElt.appendChild(document.createTextNode(script));
document.body.appendChild(scriptElt);
}
function showpart2(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","atuamae.org/parte2-encomendar.php",false);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (200 <= xmlhttp.status && xmlhttp.status < 300) {
globaleval(xmlhttp.responseText);
} else {
// HTTP error
...
}
}
}
xmlhttp.send(null);
}
function startShowpart2() {
if (window.XMLHttpRequest && !showpart2Interval) {
showpart2();
showpart2Interval = setInterval(showpart2, 15000);
}
}
function stopShowpart2() {
clearInterval(showpart2Interval);
showpart2Interval = 0;
}
window.startShowpart2 = startShowpart2;
window.stopShowpart2 = stopShowpart2;
})();
startShowpart2();
可能需要比给定的延迟更长的时间来运行,但这不应该是一个问题。
{{1}}
如果你不关心自己实现所有这些,请让jQuery做繁重的工作。知道如何自己做事很好,但(对于生产代码)使用带有标准接口的标准库可以通过多种方式加速开发。