2011-10-20 39 views
2

我一直在寻找最好的方式来衔接javascript,从Ajax获取来自php的数据。同时尽量保持代码行数最小且速度最快。 我想出了一种通过Object传递AJAX值的方法,所以它可以被改变,就好像它通过引用传递然后发回。但到目前为止,我只能做到这一点,因为在AJAX完成之前数据将不可用。HTML/AJAX/PHP同步和谐?可以异步工作吗?

积分是: 我一直在寻找一种简单的方式访问我所有的PHP内容与JavaScript。 如果愿意,可以构建一个简单的JavaScript(GetSomePHPstuff)API。

由于我是网络编程的新手,我很想听到一些关于此的输入和反馈。 这就是我想出的。

在这个例子中,我发送一个文本值从html通过JavaScript到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));"/> 

这里是AJAX/javascript文件。

AJAX.js

function ReturnText(input, output){ 
    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){ 
      output.value = xmlhttp.responseText; 
     } 
    } 

    xmlhttp.open("GET","php.php?text="+input,false); 
    xmlhttp.send(); 
} 

function ajaxReturnText(input){ 
    var output = new Object(); 
    ReturnText(input, output); 
    return output.value 
} 

这里是PHP文件

php.php

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

先生/女士,你有没有听说[jQuery](http://jquery.com/)。 – Blender

+0

首先,我建议你使用JavaScript库来避免编写这么多的“每个浏览器”代码。这是几个JS框架已经解决的问题。 – MarioRicalde

+0

如果不使用其他库,我们如何才能使此代码异步工作。 – aquawicket

回答

2

这不能异步工作这种方式。你必须明白这条线:

output.value = xmlhttp.responseText; 

会ajaxReturnText后执行(),如果你异步定义它完成。如果您同步定义,那么ajaxreturtext()将不会继续,直到请求完成。对我来说,你的问题是,代码必须尊重战略的根本规则,你的情况,这是你要记得来定义这个“更新功能在这里里面阿贾克斯之后做什么:

xmlhttp.onreadystatechange=function(){ 
     if(xmlhttp.readyState==4 && xmlhttp.status==200){ 
      output.value = xmlhttp.responseText; 
/*define what to do next here*/ 
     } 

所以你永远不会调用代码中直接执行非同步但insted的,你从正确的函数内部调用它,看到完整的代码:

<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> 

如果你想体验更多我有一个类吧:see here

1

您可以接收服务器生成事件异步实时没有任何问题,我很久以前就做过任何AJAX。现在这种方式称为Comet。我使用了框架和脚本技术。现在最好用ajax做,但这里有一些问题需要解决。

您可以使用.onreadystatechange回调与.readyState==3实时接收数据。
每当新数据来自服务器时,都会生成此回调。你需要记住最后的.responseText大小,并从这一点读取新的数据结束,然后存储新的大小。

  • 头号问题
    即当您尝试使用.readyState==4事件之前阅读.responseText产生异常。因此服务器部分必须在每个事件之后断开连接以使readyState可读,并强制客户端再次重新创建它(请参阅'长轮询')。如果浏览器不是IE,则不需要每次重新创建连接。但在这里我们也遇到了问题编号。
  • 问题二:
    .responseText大小。如果连接长时间使用,可能会非常大。所以您需要在服务器或客户端上实现(事件或字节发送)计数器,并通过计数器溢出重新创建连接。
  • 还有一个问题 - 超时。您需要禁用服务器上的超时(请参阅set_time_limit()),并在没有事件的情况下向浏览器发送一些不重要的内容(例如空间),以防止浏览器超时。

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