去评论
dz插件网

Discuz!X 源码分析之 ajaxget() 函数

左右不逢缘
2023/07/24 18:43:35
函数简介:ajaxget() 函数与 ajaxpost() 一样,都是是 Discuz!X 系统中很重要的函数,是 Discuz!X 系统中 实现 Ajax 功能的重要组成部分,在整个源码中有上百次调用,掌握 ajaxget 的工作原理和使用方法对于理解 Discuz!X 系统的 Ajax 机制和针对 Discuz!X 系统的二次开发都将大有裨益。下文将为您讲解 ajaxpost 的工作原理。

函数原型:function ajaxget(url, showid, waitid, loading, display, recall)
所属文件:common.js

参数说明及示例关键代码:
url:(必填)请求的url;
showid:(必填)ajax 返回信息显示区域的 id;
waitid:ajax 请求过程中显示等待信息区域的 id;默认与showid相同
loading:在等待区域显示的提现信息,比如:“请稍后...”
display:信息返回后 showId 的 style.display 值,就是指定返回信息是否显示的
recall:信息返回后执行的代码。

ajaxget() 函数在整个 Discuz!X 中有很多处调用!粗略统计了一下,ajaxget() 和 ajaxpost() 均有100多处调用!在模版文件中一般是直接调用,在js文件中一般是间接调用。

最简单的 ajaxget() 调用的例子就是用户登录以后,在用户名后面那个“切换在线状态”的功能!即登录后处于在线状态,点击“在线”后,就切换到“隐身”状态,在点击“隐身”则又可以切换回“在线”状态。代码如下:
  1. <span id="loginstatus">    <a id="loginstatusid" href="member.php?mod=switchstatus" title="切换在线状态" onclick="ajaxget(this.href, 'loginstatus');return false;" class="xi2">在线</a></span>

1、当用户点击“在线”的时候,将触发调用 ajaxget(),而标签 A 是不会跳转,因为 onclick 事件获得了一个 false的返回值!

2、进入 ajaxget() 函数内部处理流程,第一步便是创建 Ajax 对象!关于 Ajax 对象的更多内容,可以参考 Ajax() 函数过程。

3、设置好相关参数以后,ajaxget 调用 Ajax 对象方法 get(),执行流程将转入 Ajax.get() 执行!代码如下:
  1. x.get(url, function(s, x){...});

url 是 ajaxget 提交的 url,根据 Ajax.get() 定义可知,当 Ajax 调用返回时,将调用 function(s,x);

4、进入 Ajax.get() 函数处理流程,服务器返回的 Ajax 信息将保存在对象中,并返回给 ajaxget 指定的函数,即 function(s,x);

5、在 function(s,x) 中,将首先将返回信息中的TEXT部分直接保存在 $('showid').innerHTML 中,然后将附带的 js 脚本添加到 <head> 部分并执行,完成动态修改在线状态,或者其他内容,添加的 js 脚本代码如下:
  1. <script type="text/javascript" id="cbbLYGtmoPqvpWrwoymULIJQFPrvolFH" charset="GBK">if(typeof succeedhandle_=='function') {succeedhandle_('http://localhost/forum.php', '隐身', {});}</script>

ajaxget() 的核心内容,其实在 Ajax() 中,通过读源码,我们可以知道,其实 Ajax 还能实现 post 方式的交互,但是正如之前我们知道的,ajaxpost() 不是通过 Ajax() 来实现的,而是使用了 iframe 的方法!