Posted on 2007-04-15 21:18
City22 阅读(3689)
评论(18) 编辑 收藏 所属分类:
Javascript <!---->
在大型RIA中,动态加载技术十分重要,毕竟几百K甚至M级别的脚本让用户等待加载完了再浏览是不可能。大多数成熟的framework都有动态加载技术的实现,就是说先加载一个最基础功能,然后利用动态加载技术慢慢把所有的脚本加进来,或者说需要某个功能的时候再加载某个模块所 需要的javascript的文件。
好了不说那么多P话了,尽快进入正题来看看GI是怎么实现的动态加载技术。其实GI的load做的很复杂,因为他涉及到了进度条阿等等很多乱七八糟的东西,我们就不分析那么多东西了,来看看他最基础的东西是如何实现的吧。GI中的动态加载有两种,一种是用的是XMLHttpRequest来请求脚本内容,另一种则是加入一个 <script>标签的方式来动态加入脚本以达到动态加载的功能。网上也许还有其它得方法,但其它得方法也都是根据这两种演变来的,还是以这两种为基础得。我们来看看它是如何实现的。
首先是第一种
/** @private @jsxobf-clobber */
ClassLoader_prototype.loadJSFileSync = function(strURI) {
var req = new jsx3.net.Request();
req.open("GET", strURI, false);
req.send();
if (req.getStatus() == jsx3.net.Request.STATUS_OK) {
var script = req.getResponseText();
jsx3.eval(script);
return true;
}
return false;
};
呵呵,XMLHttpRequest的GET请求就可以吧js文件拿下来,然后用eval执行所有的脚本,这样就达到了加载脚本的功能了。方法也很简单,也就不用多介绍什么了吧。不过我记着有人说过js必须要UTG-8格式存的,但测试了一下,不用好像也可以。
我们看在package。Js文件里面有个有意思的方法
/**
* Ensures that one or more classes is available before this method returns. Any class that fails to load will
* throw an error. Only classes that can be found by the system class loader may be loaded in this manner.
*
* @param strClass {String} the fully-qualified names of the classes to load.
* @since 3.2
*/
jsx3.require = function(strClass) {
for (var i = 0; i < arguments.length; i++) {
var className = arguments[i];
className = jsx3._REQUIRE_MAP[className] || className;
if (jsx3.Class.forName(className) == null)
jsx3.CLASS_LOADER.loadClass(className);
}
};
需要说明的是jsx3.ClASS_LOADER.loadClass()方法中其实就是调用了loadJSFileSync()方法,这个方法就是在调用类之前如果该类没有被加载将会在被load一次做到需要什么才用什么,不会把所有Javascipt都加载进来。
然后我们再来看第二种方法,添加标签的方式来load脚本
/** @private @jsxobf-clobber */
ClassLoader_prototype.loadScript = function(strSrc, strId) {
// instance a new DOM element
var element = document.createElement("script");
element.src = strSrc;
element.type = 'text/javascript';
element.id = strId;
element.language = 'javascript';
// set up onload handler
var me = this;
if (this.IE) {
element.onreadystatechange = function() {
var state = this.readyState;
if (state == "loaded" || state == "interactive" || state == "complete") {
this.onreadystatechange = null;
me._loaded[strSrc] = true;
me._publish({subject:"load", type:"script", src:strSrc});
}
};
} else if (this.MOZ || this.KON) {
element.onload = function() {
element.onload = null;
me._loaded[strSrc] = true;
me._publish({subject:"load", type:"script", src:strSrc});
};
}
element.jsxid = strSrc;
// bind the element to the browser DOM to begin loading the resource
document.getElementsByTagName("head")[0].appendChild(element);
};
呵呵,相信大家都能看懂吧,就是在head标签中加入了script标签,src当然就是重点了,而如何判断脚本加载结束,也明确的告诉我们,在IE下用onreadystatechange,在Firefox下用onload。呵呵,好像很简单吧。
到这里,我突然想到一个问题,script标签好像功能很强大啊,竟然可以用来读服务器上的Javascript文件,跟XMLHttpRequest有同样的功能啊,看来这个东西可以被我们来利用一下了,做点手脚也许会有不同的效果哦,来看。
首先我们写一个Handlers用来模拟一个Javascript文件,然后用这个handler来生成返回的内容,
<httpHandlers>
<add verb="*" type="JsTest.JsHandler" path="demo2.js"/>
</httpHandlers>
public class JsHandler:IHttpHandler,IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
string action = context.Request["action"].ToString();
context.Response.Write("alert(\"hello world " + action + "\");");
}
}
这个Handler中我只是返回了一段alert,呵呵,下面用script来加载他吧,刚才看到的一样,只是script中src我们做了点手脚,嘿嘿指向的是demo2.js?action=city22,哈哈看到了吧,就是个GET访问方式啊!
window.onload=function()
{
var script=document.createElement("script");
script.type='text/javascript';
script.language='javascript';
script.src="demo2.js?action=city22";
document.getElementsByTagName("head")[0].appendChild(script);
}
测试成功,哈,看来还真是能模拟一个XMLHttpRequest了。
不过有人肯定该问了,这个有什么用XMLHttpRequest已经很好用了啊,干嘛在来个这东西。我感觉这东西在一定的领域还是能发挥作用的。XMLHttpRequest不能垮站访问,这是个问题,也就是说你在www.a.net/index.html上写了一段XMLHttpRequest不能调用www.b.net上的任何东西,即使改动document.domian 也不可以,唉多可惜。当然了Iframe给我们解决了这个问题,但是script标签又给了我们新的选择,我们完全可以模拟open(),send(),等这些方法,返回的脚本中使用变量作为返回内容来模拟responseText。看来跨站问题又有了新的解决思路了。以后script标签值得我们去深入研究一下咯。
相关推荐
"Gi盘——基于hadoop的分布式网盘项目"是一个开源的、基于Hadoop技术实现的分布式文件存储系统,旨在提供类似网盘的功能。Hadoop是一个广泛使用的开源框架,主要用于处理和存储大规模数据集,它利用分布式计算来提高...
JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责实现客户端的交互效果和动态功能。在“javascript经典特效---搜索引擎的集合.rar”这个压缩包中,我们聚焦的是JavaScript在实现搜索引擎特效上...
FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书.pdf
FPGA可编程逻辑器件芯片XC3S100E-5FG400GI中文规格书.pdf
FPGA可编程逻辑器件芯片XC3S100E-5FG320GI中文规格书.pdf
FPGA可编程逻辑器件芯片XC3S100E-4FG484GI中文规格书.pdf
本文档旨在详细介绍JavaScript正则表达式中的两个重要参数——`g`(全局匹配)和`i`(忽略大小写),以及它们的组合`gi`。通过学习这些参数,开发者能够更加高效地使用正则表达式解决实际问题。 #### 二、基础概念 ...
《FPGA可编程逻辑器件芯片XC3S100E-5FG484GI中文规格书》 本文将深入探讨FPGA(Field-Programmable Gate Array)可编程逻辑器件,具体为XC3S100E-5FG484GI型号,主要关注其在封装、电路板设计以及电源管理方面的...
文档中的"FPGA可编程逻辑器件芯片XC3S100E-4FG484GI中文规格书"涉及了FPGA(Field-Programmable Gate Array)芯片的主要特性,特别是时钟管理和PLL(Phase-Locked Loop)控制。下面将详细阐述这些知识点。 1. **PLL...
根据给定的文件信息,我们将深入探讨与"JavaScript-Core"相关的关键知识点,这些知识点主要集中在JavaScript的核心语言语法上,这是所有JavaScript开发者的基础。下面将详细阐述这些知识点。 ### JavaScript核心...
本项目是一个基于go-gi的nweb服务框架,旨在提供快速、高效且易于扩展的Web应用开发体验。项目结构清晰,包含api层、model模型数据层、service逻辑层等核心模块,以及config系统配置、db数据库、migrations数据迁移...
先卸载旧版 yum remove git 添加新源后安装新版(软件包 git2u 已经被 git216 取代) ...yum install -y git216 ...————————————————————- 参考https://my.oschina.net/tonystark/blog/1920556 #
【标题】:“gi945解除限制(pj)bios”涉及的是针对华为GI945主板的BIOS修改技术,其主要目的是为了突破BIOS原有的功能限制,以便于用户能够安装自选的操作系统,尤其是那些可能因为硬件兼容性问题而无法正常安装的...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
文档标题和描述提到了"FPGA可编程逻辑器件芯片XC3S100E-5FG320GI"的相关规格书,但具体内容并未提供这部分资料,而是涉及了内存保护(Memory Protection)和功能单元(Functional Units)的概念,这部分内容可能属于...
《Advances in Real-Time Voxel-Based GI - GDC 2018》是2018年游戏开发者大会(GDC)上关于实时体素全局光照(Voxel-Based Global Illumination,简称Voxel GI)技术的一篇论文。这篇文章深入探讨了在实时图形渲染...
【3dmmods_原神自定义模型导入工具(GI-Model-Importer)】 原神,作为一款备受全球玩家喜爱的开放世界冒险游戏,其丰富的角色和环境设计吸引着大量玩家进行二次创作。为了满足这些玩家的需求,3DMods社区开发了一...
g: 全局匹配 i: 忽略大小写 gi: 全局匹配 + 忽略大小写
4. **AJAX技术**:GI利用AJAX(Asynchronous JavaScript and XML)技术,提供部分页面刷新和异步通信,提升用户体验。 5. **集成能力**:TIBCO GI可以无缝集成其他TIBCO产品,如TIBCO ActiveMatrix BusinessWorks,...