深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

xajax的源码分析

查看数: 839 | 评论数: 8 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-1-2 18:20

正文摘要:

xajax.prepareRequest函数的入口 URI:"/basicajax.php?XDEBUG_SESSION_START=d4p&XDEBUG_PROFILE_STOP=1&restore_session=1" callback:{timers: {…}, onRequest: null, onResponseDelay: null, onExpir ...

回复

zhgc 发表于 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;
复制代码


zhgc 发表于 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>




zhgc 发表于 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);
                }
        }
zhgc 发表于 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>
复制代码
zhgc 发表于 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. }
复制代码
zhgc 发表于 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)
zhgc 发表于 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);
      
}

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

GMT+8, 2025-6-29 08:32 , Processed in 0.058175 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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