深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 837|回复: 8
打印 上一主题 下一主题

xajax的源码分析

[复制链接]

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
跳转到指定楼层
楼主
发表于 2020-1-2 18:20:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
xajax.prepareRequest函数的入口

URI:"/basicajax.php?XDEBUG_SESSION_START=d4p&XDEBUG_PROFILE_STOP=1&restore_session=1"
callback:{timers: {…}, onRequest: null, onResponseDelay: null, onExpiration: null, beforeResponseProcessing: null, …}
commonHeaders:{If-Modified-Since: "Sat, 1 Jan 2000 00:00:00 GMT"}
contentType:"application/x-www-form-urlencoded"
context:Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
cursor:{onWaiting: ƒ, onComplete: ƒ}
functionName:{xjxfun: "ajaxProcess"}
getHeaders:{}
httpVersion:"HTTP/1.1"
maxObjectDepth:20
maxObjectSize:2000
method:"POST"
mode:"asynchronous"
parameters:Arguments(6) ["Index", "Button1", null, "Button1Click", {…}, Array(0), callee: ƒ, Symbol(Symbol.iterator): ƒ]
postHeaders:{content-type: "application/x-www-form-urlencoded"}
requestData:"xjxfun=ajaxProcess&xjxr=1577959851647&xjxargs[]=SIndex&xjxargs[]=SButton1&xjxargs[]=*&xjxargs[]=SButton1Click&xjxargs[]=%3Cxjxobj%3E%3Ce%3E%3Ck%3Eserverevent%3C%2Fk%3E%3Cv%3ES%3C%2Fv%3E%3C%2Fe%3E%3Ce%3E%3Ck%3Eserverparams%3C%2Fk%3E%3Cv%3ES%3C%2Fv%3E%3C%2Fe%3E%3Ce%3E%3Ck%3EButton1%3C%2Fk%3E%3Cv%3ES%3C!%5BCDATA%5Bclicked%20Ajax%202020-01-02%209%3A21%3A16%20am%5D%5D%3E%3C%2Fv%3E%3C%2Fe%3E%3C%2Fxjxobj%3E&xjxargs[]=%3Cxjxobj%3E%3C%2Fxjxobj%3E"
requestRetry:4
requestURI:"/basicajax.php?XDEBUG_SESSION_START=d4p&XDEBUG_PROFILE_STOP=1&restore_session=1"
retry:5
returnValue:false
status:{onRequest: ƒ, onWaiting: ƒ, onProcessing: ƒ, onComplete: ƒ}
statusMessages:false
waitCursor:true
__proto__:Object

xajax.prepareRequest函数的出口



回复

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
沙发
 楼主| 发表于 2020-1-23 00:49:06 | 只看该作者
简单的ajax的触发过程如下:

/* <![CDATA[ */
xajax_ajaxProcess = function() { return xajax.request( { xjxfun: 'ajaxProcess' }, { parameters: arguments } ); };
/* ]]> */


function Button1JSClick(event)
{

var event = event || window.event;
var params=null;
xajax_ajaxProcess('Index','Button1',params,'Button1Click',xajax.getFormValues('Index'),[]);
       //Return false to prevent the button submit the form
      return(false);
      
}
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
板凳
 楼主| 发表于 2020-1-29 16:41:03 | 只看该作者
在inernalSend时,多了以下几个属性:

applyRequestHeaders:ƒ ()
finishRequest:ƒ ()
open:ƒ ()
request:XMLHttpRequest {onreadystatechange: ƒ, readyState: 1, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, …}

setCommonRequestHeaders:ƒ ()
setGetRequestHeaders:ƒ ()
setPostRequestHeaders:ƒ ()
setRequestHeaders:ƒ (headers)
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
地板
 楼主| 发表于 2020-1-29 17:26:14 | 只看该作者
ajax

回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
5#
 楼主| 发表于 2020-1-29 17:33:13 | 只看该作者
为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject :
实例
  1. var xmlhttp;
  2. if (window.XMLHttpRequest)
  3. {
  4.     //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
  5.     xmlhttp=new XMLHttpRequest();
  6. }
  7. else
  8. {
  9.     // IE6, IE5 浏览器执行代码
  10.     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  11. }
复制代码
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
6#
 楼主| 发表于 2020-1-29 17:39:43 | 只看该作者
简单范例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <script>
  6. function loadXMLDoc()
  7. {
  8.         var xmlhttp;
  9.         if (window.XMLHttpRequest)
  10.         {
  11.                 //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
  12.                 xmlhttp=new XMLHttpRequest();
  13.         }
  14.         else
  15.         {
  16.                 // IE6, IE5 浏览器执行代码
  17.                 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  18.         }
  19.         xmlhttp.onreadystatechange=function()
  20.         {
  21.                 if (xmlhttp.readyState==4 && xmlhttp.status==200)
  22.                 {
  23.                         document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
  24.                 }
  25.         }
  26.         xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
  27.         xmlhttp.send();
  28. }
  29. </script>
  30. </head>
  31. <body>

  32. <div id="myDiv"><h2>使用 AJAX 修改该文本内容</h2></div>
  33. <button type="button" onclick="loadXMLDoc()">修改内容</button>

  34. </body>
  35. </html>
复制代码
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
7#
 楼主| 发表于 2020-1-29 20:55:54 | 只看该作者
        if ('undefined' != typeof oRequest.userName && 'undefined' != typeof oRequest.password) {
                oRequest.open = function() {
                        this.request.open(this.method, this.requestURI, 'asynchronous' == this.mode, oRequest.userName, oRequest.password);
                }
        } else {
                oRequest.open = function() {
                        this.request.open(this.method, this.requestURI, 'asynchronous' == this.mode);
                }
        }
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
8#
 楼主| 发表于 2020-1-29 21:13:37 | 只看该作者
xjxfun=ajaxProcess&xjxr=1577959851647&xjxargs[]=SIndex&xjxargs[]=SButton1&xjxargs[]=*&xjxargs[]=SButton1Click&xjxargs[]=%3Cxjxobj%3E%3Ce%3E%3Ck%3Eserverevent%3C%2Fk%3E%3Cv%3ES%3C%2Fv%3E%3C%2Fe%3E%3Ce%3E%3Ck%3Eserverparams%3C%2Fk%3E%3Cv%3ES%3C%2Fv%3E%3C%2Fe%3E%3Ce%3E%3Ck%3EButton1%3C%2Fk%3E%3Cv%3ES%3C!%5BCDATA%5Bclicked%20Ajax%202020-01-02%209%3A21%3A16%20am%5D%5D%3E%3C%2Fv%3E%3C%2Fe%3E%3C%2Fxjxobj%3E&xjxargs[]=%3Cxjxobj%3E%3C%2Fxjxobj%3E

http://www.jsons.cn/urlencode/解码后得到:

xjxfun=ajaxProcess&xjxr=1577959851647&xjxargs[]=SIndex&xjxargs[]=SButton1&xjxargs[]=*&xjxargs[]=SButton1Click&xjxargs[]=<xjxobj><e><k>serverevent</k><v>S</v></e><e><k>serverparams</k><v>S</v></e><e><k>Button1</k><v>S<![CDATA[clicked Ajax 2020-01-02 9:21:16 am]]></v></e></xjxobj>&xjxargs[]=<xjxobj></xjxobj>

格式化后是:
  xjxfun=ajaxProcess
&xjxr=1577959851647
&xjxargs[]=SIndex
&xjxargs[]=SButton1
&xjxargs[]=*
&xjxargs[]=SButton1Click
&xjxargs[]=<xjxobj><e><k>serverevent</k><v>S</v></e><e><k>serverparams</k><v>S</v></e><e><k>Button1</k><v>S<![CDATA[clicked Ajax 2020-01-02 9:21:16 am]]></v></e></xjxobj>
&xjxargs[]=<xjxobj></xjxobj>


这个类似xml的内容:
<xjxobj>
        <e>
                <k>serverevent</k>
                <v>S</v>
        </e>
        <e>
                <k>serverparams</k>
                <v>S</v>
        </e>
        <e>
                <k>Button1</k>
                <v>S<![CDATA[clicked Ajax 2020-01-02 9:21:16 am]]></v>
        </e>
</xjxobj>




回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7725

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7725
9#
 楼主| 发表于 2020-1-29 21:36:52 | 只看该作者
ajax把requestData发送到后台,后台是如何处理的?

看requestData的xjxargs属性,搜索xjxargs后发现在File: xajaxArgumentManager.inc.php

而xajaxArgumentManager.inc.php是被文件File: xajax.inc.php引用的

而xajax.inc的引用,如下:
  1.     /**
  2.     * This method is called to setup the Ajax functionality when dumping Page code
  3.     *
  4.     * When generating the page code, if ajax support is enabled, this method dumps
  5.     * the right code to create the xajax object, setup xajax debug support if required
  6.     * and to register the processing function for ajax requests as ajaxProcess(), and
  7.     * finally, processes all the incomming ajax requests
  8.     *
  9.     * @see getUseAjaxDebug(), getUseAjax()
  10.     */
  11.     function processAjax()
  12.     {
  13.         if (($this->ControlState & csDesigning) != csDesigning)
  14.         {
  15.                 use_unit("xajax/xajax_core/xajax.inc.php");
  16.                 //AJAX support
  17.                 global $xajax;

  18.                 $xajaxuri=$_SERVER['REQUEST_URI'];

  19.                 if ($this->UseAjaxUri!='') $xajaxuri=$this->UseAjaxUri;
复制代码


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-6-29 07:31 , Processed in 0.078775 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表