Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTML/AJAX/PHP同步和谐?异步能工作吗?_Php_Javascript_Html_Ajax_Synchronous - Fatal编程技术网

HTML/AJAX/PHP同步和谐?异步能工作吗?

HTML/AJAX/PHP同步和谐?异步能工作吗?,php,javascript,html,ajax,synchronous,Php,Javascript,Html,Ajax,Synchronous,我一直在研究用Ajax桥接javascript从php获取数据的最佳方法。 同时尽量将代码行数控制在最小,并以最快的速度运行。 我想出了一种方法,通过对象向AJAX传递一个值,这样就可以像通过引用传递一样对其进行修改,然后将其发回。但到目前为止,我只能进行同步,因为在AJAX完成之前,数据将不可用 重点是: 我一直在寻找一种使用javascript轻松访问所有PHP内容的方法。 如果愿意,可以构建一个简单的javascript(GetSomePHPstuff)API 由于我是一名网络编程新手,我

我一直在研究用Ajax桥接javascript从php获取数据的最佳方法。 同时尽量将代码行数控制在最小,并以最快的速度运行。 我想出了一种方法,通过对象向AJAX传递一个值,这样就可以像通过引用传递一样对其进行修改,然后将其发回。但到目前为止,我只能进行同步,因为在AJAX完成之前,数据将不可用

重点是: 我一直在寻找一种使用javascript轻松访问所有PHP内容的方法。 如果愿意,可以构建一个简单的javascript(GetSomePHPstuff)API

由于我是一名网络编程新手,我希望听到一些关于这方面的意见和反馈。 这就是我想到的

在本例中,我通过javascript将一个文本值从html发送到ajax到php,php将其发送回ajax,再返回javascript到我的html页面。

这是我们的简单HTML类型文件

TEST.html

<script language="javascript" src="ajax.js"></script>

<input type="text" id="text"/>
<input type="button" value="Return Text" 
onClick="alert(ajaxReturnText(document.getElementById('text').value));"/>
这是PHP文件

php.php

<?php 
function ReturnText($text){
    return $text;
}
if($text = $_GET["text"]){
    echo ReturnText($text);
    die();
}
?> 

这种方式无法异步工作。您必须了解这一行:

output.value = xmlhttp.responseText;
如果异步定义ajaxReturnText(),则将在ajaxReturnText()完成后执行。如果同步定义,则在请求完成之前,ajaxreturtext()将不会继续。对我来说,您的问题是代码必须遵守基本规则,在您的情况下,您必须记住在ajax之后在“更新函数”中定义要做什么:

xmlhttp.onreadystatechange=function(){
        if(xmlhttp.readyState==4 && xmlhttp.status==200){
            output.value = xmlhttp.responseText;
/*define what to do next here*/
        }
因此,您从不直接调用要异步执行的代码,而是从适当的函数内部调用,请参阅完整代码:

<html>
<head>
<script type="text/javascript"> 
/*to be called synch*/
function ReturnText(input){
    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
    }
    else{// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function(){
        if(xmlhttp.readyState==4 && xmlhttp.status==200){ 
            /*here define what to be called asynch*/
            ajaxReturnText(xmlhttp.responseText); 
        }
    } 
    xmlhttp.open("GET","php.php?text="+input,true);
    xmlhttp.send();
}

/*to be called asynch*/
function ajaxReturnText(input){
    var output = new Object();
    output.value =input; 
    alert(output.value);
     document.getElementById('test').innerHTML=
     "This is the value of the object: "+input;
}
</script>
</head>
<body>
<div id="test"></div>
<input type="text" id="text"/>
<input type="button" value="Return Text" 
onClick="ReturnText(document.getElementById('text').value);"/> 
</body>
</html>

/*称为同步*/
函数返回文本(输入){
if(window.XMLHttpRequest){//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}
else{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
xmlhttp.onreadystatechange=函数(){
如果(xmlhttp.readyState==4&&xmlhttp.status==200){
/*这里定义什么叫做异步*/
ajaxReturnText(xmlhttp.responseText);
}
} 
open(“GET”,“php.php?text=“+input,true”);
xmlhttp.send();
}
/*被称为异步的*/
函数ajaxReturnText(输入){
var输出=新对象();
输出值=输入;
警报(输出值);
document.getElementById('test').innerHTML=
这是对象的值:“+输入;
}

如果你想体验更多,我有一个类:

你可以实时异步接收服务器生成的事件,没有任何问题,我早在AJAX出现之前就这样做了。现在这种方式叫做。我使用了框架和脚本技术。现在最好使用AJAX,但这里有些问题你必须解决

您可以使用带有
的.onreadystatechange回调来实时接收数据。readyState==3

每次新数据来自服务器时都会生成此回调。您需要记住上一次
.responseText
size,并从此点读取新数据,然后存储新大小

  • 第一题
    IE在事件之前尝试读取
    .responseText
    时生成异常,此时
    .readyState==4
    。因此服务器部件必须在每个事件之后断开连接,以使readyState可读并强制客户端重新创建它(请参阅“长轮询”)。如果浏览器不是IE,您不需要每次都重新创建连接。但这里我们也面临问题编号
  • 问题之二:
    .responseText
    大小。如果长时间使用连接,它可能会非常大。因此,您需要在服务器或客户端上实现(事件或字节发送)计数器,并通过计数器溢出重新创建连接
  • 还有一个问题-超时。您需要禁用服务器上的超时(请参阅
    设置时间限制()
    ),并在没有阻止浏览器超时的事件时向浏览器发送一些无关紧要的内容(例如空格)

通常服务器需要两个通道:上传和下载。你有jQuery或其他框架的上传通道,但我不确定下载。我担心你不能在jQuery中使用
readyState==3
技术。可能可以吗?

先生/女士,你听说过吗。首先,我建议你使用JavaScript库以避免没有o编写这么多“每浏览器”代码。这是几个JS框架已经解决的问题。如果不使用另一个库,我们如何使此代码异步工作。@Blender感谢您的提示。我将研究jQuery。如果您希望能够调用
ajaxReturnText()
与任何其他返回值的函数一样,您必须坚持使用同步Ajax调用。有一些方法可以重构代码,而不是使用异步Ajax的回调,异步Ajax在某些情况下可以很好地工作,但在另一些情况下会变得混乱。无论哪种方法,我都同意其他人关于使用库为您执行实际Ajax调用的看法。(顺便说一句,“我想要反馈”并不是堆栈溢出想要承载的那种“问题”。)
<html>
<head>
<script type="text/javascript"> 
/*to be called synch*/
function ReturnText(input){
    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
    }
    else{// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function(){
        if(xmlhttp.readyState==4 && xmlhttp.status==200){ 
            /*here define what to be called asynch*/
            ajaxReturnText(xmlhttp.responseText); 
        }
    } 
    xmlhttp.open("GET","php.php?text="+input,true);
    xmlhttp.send();
}

/*to be called asynch*/
function ajaxReturnText(input){
    var output = new Object();
    output.value =input; 
    alert(output.value);
     document.getElementById('test').innerHTML=
     "This is the value of the object: "+input;
}
</script>
</head>
<body>
<div id="test"></div>
<input type="text" id="text"/>
<input type="button" value="Return Text" 
onClick="ReturnText(document.getElementById('text').value);"/> 
</body>
</html>