How to Auto Include a Javascript File


Posted in Javascript onFebruary 02, 2007

Form: http://www.webreference.com/programming/javascript/mk/
Author:Mark Kahn

Many developers have a large library of JavaScript code at their fingertips that they developed, their collegues developed, or that they've pieced together from scripts all over the Internet. Have you ever thought that it would be nice to not have to search through all those files just to find that one function? This article will show you how dynamically include any JavaScript file, at runtime, by simply calling a function in that file!

Here's an example: You have a function foo() in file bar.js. In your code, you know that foo() might be called, but it probably won't be because most people do not use its functionality. You don't want to force the user to download bar.js unless it's going to be used because it's a fairly large file. Here you'll learn how to make a fake foo() function that actually loads bar.js on the fly and then calls the real foo() function.

Dynamically Loading a Script
As many developers know, there are at least two different ways to dynamically load a script at runtime. The first is to create a script object and append it to the document. The second is to use an XMLHTTP request to grab the source code, and then eval() it. 

It is this second method that we're going to use, and we're going to exploit the fact that an XMLHTTP request has the capability to completely stall any script activity. 

First, some basics: how to create an XMLHTTP Object. There are as many different functions to return a cross-browser XMLHTTP Object as there are developers that work with AJAX. I happen to have my own as well, and here's a simplified example of that: 

function getXMLHttpObj(){  
  if(typeof(XMLHttpRequest)!='undefined')  
    return new XMLHttpRequest();    var axO=['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.4.0',  
    'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'], i;  
  for(i=0;i<axO.length;i++)  
    try{  
      return new ActiveXObject(axO[i]);  
    }catch(e){}  
  return null;  
} 

Most browsers other than Internet Explorer 5 or 6 have a built-in XMLHttpRequest object. Internet Explorer 7, when it's released, will also have this object natively. The first thing we do is check to see if this object exists. If it does, we create an instance of it and that's it. If the object doesn't exist, we attempt to create one of several ActiveX Objects. We don't know what objects our users have installed, so we attempt to create several different XMLHTTP objects, starting with the newest ones. 

Now in order to dynamically load functions, we first need to define them. We could do this one function at a time, but instead of hard-coding dozens of functions, we can choose to just make an object or array with all the file names and the functions you want to have auto-included: 

var autoIncludeFunctions = {  
  'scripts/file1.js': ['function1', 'function2', 'function3'],  
  'scripts/file2.js': ['function4', 'function5', 'function6'],  
  'scripts/file3.js': ['function7', 'function8', 'function9']  
} 

Our autoIncludeFunctions object should contain a list of JavaScript files, as well as a list of functions in those files. Here we are using shorthand JavaScript notation to create both the object and the arrays, but the same thing could be accomplished in many different ways. 

These .js files can contain any code you have available, such as JavaScript menus, animations, etc. The simplest example would be a file titled "file1.js" that only contained "function function1(){ alert('Hello, World!'); }".

Note that if any of these files contain functions with the same name as another file, only the last function listed will be used. 

To make things a bit easier, we're going to make a function that will pull a JavaScript file down and execute it. It's very important, in our case, that the third paramater sent to the XMLHTTP object be false. This forces the script to wait for the response to download as opposed to continuing on with other code. 

function loadScript(scriptpath, functions){  
  var oXML = getXMLHttpObj();  
  oXML.open('GET', scriptpath, false);  
  oXML.send('');  
  eval(oXML.responseText);  
  for(var i=0; i<functions.length; i++)  
    window[functions[i]] = eval(functions[i]);  
} 
The loadScript function expects two arguments: scriptpath and functions. "scriptpath" should contain the URL to your JavaScript file, and "functions" is the array of functions that exist in this JavaScript file.

As you can see, the code to pull and execute a script is straightforward. The browser first downloads, and then interprets the JavaScript file. If you've read any other articles on AJAX development, you might remember that in most cases the third argument sent to the open() function of an XMLHTTP object is usually "true." In our case we have it set to "false." This argument controls the state of the XMLHTTP object. If set to true, the object runs asynchrounously, meaning that all other JavaScript code continues while the object is loading. While this is a good thing in many circumstances, if we implemented it here our code would return before our file was done loading. Since we want our code to wait until this file is complete, we set this third argument to false, thus pausing our JavaScript execution until we are ready to continue. 

When the code is evaluated from the responseText, it's executed in the limited scope of the loadScript function and because of this, none of these functions will be available outside of the loadScript function. In order do get around this, the for loop adds each function to the window object, thus making it globally available. 

It's important to note that only scripts on the same server as the current page can be called in this manner. This is inherent to the XMLHTTP Object and is a necessary measure to increase general browser security. 

Javascript 相关文章推荐
ie6下png图片背景不透明的解决办法使用js实现
Jan 11 Javascript
jquery validate 自定义验证方法介绍 日期验证
Feb 27 Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 Javascript
了不起的node.js读书笔记之例程分析
Dec 22 Javascript
js实现图片从左往右渐变切换效果的方法
Feb 06 Javascript
jQuery实现DIV层收缩展开的方法
Feb 27 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
Apr 11 Javascript
js构建二叉树进行数值数组的去重与优化详解
Mar 26 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
vue transition 在子组件中失效的解决
Nov 12 Javascript
利用promise及参数解构封装ajax请求的方法
Mar 24 Javascript
JavaScript实现栈结构详细过程
Dec 06 Javascript
Code:loadScript( )加载js的功能函数
Feb 02 #Javascript
JavaScript脚本性能的优化方法
Feb 02 #Javascript
JavaScript中“+=”的应用
Feb 02 #Javascript
HTTP状态代码以及定义(解释)
Feb 02 #Javascript
任意位置显示html菜单
Feb 01 #Javascript
Javascript 判断 object 的特定类转载
Feb 01 #Javascript
背景音乐每次刷新都可以自动更换
Feb 01 #Javascript
You might like
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
微信小程序3D轮播实现代码
2019/09/19 Javascript
深入Python函数编程的一些特性
2015/04/13 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
python计算两个数的百分比方法
2018/06/29 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
在python3中实现更新界面
2020/02/21 Python
Django ORM filter() 的运用详解
2020/05/14 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
校长一岗双责责任书
2015/05/09 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS