Php 是否可以使用XMLHttpRequest评估JavaScript代码
我试图使用这个AJAX请求调用一个文件,其中一些PHP工作正常,一些JavaScript工作不正常。有什么想法吗Php 是否可以使用XMLHttpRequest评估JavaScript代码,php,javascript,ajax,xmlhttprequest,eval,Php,Javascript,Ajax,Xmlhttprequest,Eval,我试图使用这个AJAX请求调用一个文件,其中一些PHP工作正常,一些JavaScript工作不正常。有什么想法吗 function showpart2(){ if(window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET","atuamae.org/parte2-encomendar.php",false); xmlhttp.send(null);
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();
您需要实际评估JS标记(手动,通过
eval
或通过DOM插入)。像jQuery这样的库可以为您做到这一点,但如果您需要使用自定义解决方案,则还需要添加该解决方案。您可以编写:
xmlhttp.responseText.getElementById('part2')
responseText是一个字符串,没有任何getElementById方法。
您可以使用xmlhttp.responseXML.getElementById(“part2”)或使用字符串方法来提取第二部分。像Adam Rackis一样,我建议您使用$。ajax确实很容易,请尝试一下……但如果您不选择它,这里有一个在IE和Firefox中进行ajax调用时使用的函数,如果您不能使用Jquery,我建议您使用Chrome。 函数中的问题在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;
}
函数newAjaxObject()
{
var oHttp=假;
天冬氨酸变种=[
“Msxml2.XMLHTTP.5.0”,
“Msxml2.XMLHTTP.4.0”,
“Msxml2.XMLHTTP.3.0”,
“Msxml2.XMLHTTP”,
“Microsoft.XMLHTTP”
];
如果(!oHttp&&typeof XMLHttpRequest!=“未定义”)
{
oHttp=新的XMLHttpRequest();
}
如果(!oHttp){
对于(var iCont=0;!oHttp&&iCont
示例代码的一个大问题是使XMLHttpRequest.send
同步意味着所有JS执行必须在等待接收请求时暂停。没有理由不使用异步调用
异步调用可以提高响应能力,但它们不能提供协调,这意味着任务在需要的数据准备就绪之前无法运行。协调异步代码的标准方法是向异步函数传递一个函数,该函数在执行时执行依赖于数据的其余计算。此函数的技术名称为“continuation”,它只是一个表示从给定点开始的其余计算的函数。也就是说,反过来:
f1();
f2();
async();
f3();
f4();
进入:
因为你传递的是一个延续,这被称为“延续传递风格”。XMLHttpRequest是一种特殊情况,它不是将函数传递给异步函数,而是将其设置为XHR对象上的readystatechange
事件的侦听器。也就是说,您将continuation分配给xmlhttp.onreadystatechange
还有一些改进要做。首先,添加错误检测。XHR实例的status
属性保存HTTP状态,可用于检查错误
正如许多其他人提到的,eval
可能会有问题,当有其他选择时,应该避免。首先,您必须确保字符串来自可信的源。eval
的特殊问题是,脚本的计算与调用eval
的上下文相同。如果eval
发生在函数内部,则脚本定义的任何内容在函数外部都不可见。如果你的脚本不需要定义任何东西(并且永远不需要定义任何东西;总是考虑你的代码的未来),你可以使用<代码> EVA/code >。否则,以脚本为内容动态创建脚本元素,并将其添加到文档中;您可以定义执行此操作的函数(请参见下面示例中的globaleval
)
xmlhttp
是一个变量,这是错误的。相反,将其声明为局部变量
与用于一次性调用的setTimeout
不同,使用它可以定期调用传递的函数。请注意,运行setTimeout
和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();
(函数(){
//防止变量污染全局命名空间
变量showpart2Interval=0,
scriptElt={parentNode:{removeChild:function(){}};
函数globaleval(脚本){
scriptElt.parentNode.removeChild(scriptElt);
scriptElt=document.createElement('script');
scriptElt.type='text/javascript'
scriptElt.appendChild(document.createTextNode(script));
document.body.appendChild(scriptElt);
}
函数showpart2(){
var xmlhttp=new XMLHttpRequest();
open(“GET”,“atuamae.org/parte2 encomendar.php”,false);
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4){
如果(200我知道这不是一个真正的答案,所以我将把它作为一个注释,但是jQuery,如果你有能力将它添加到你的站点,可以极大地简化你的ajax调用需求。这是可能的。但是使用eval
,这是一个坏主意。如果响应数据是JavaScript代码,将它放在一个脚本元素中,并将该元素附加到DOM中……你的代码被破坏,您使用同步XHR(这是魔鬼)“不起作用”在一个问题中是一个错误的陈述,请更新它:php文件返回什么?为什么首先要评估它?什么不起作用?。哦,忽略jquery人员。用jquery这么快就解决了它!!!!谢谢你的快速响应!你真是太棒了。这就是我做的:函数showpart2(){$(“#part2”).load('atuamae.org/parte2 encomendar.php');setTimeout('showpart2()',15000);};showpart2();您做得有点不对。由于最新的IE也有XMLHttpRequest
,您应该首先检查它。此外,如果访问者没有使用IE,您的循环
(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();