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 相关文章推荐
深入理解Javascript闭包 新手版
Dec 28 Javascript
JS实现两表格里数据来回转移的方法
May 28 Javascript
JavaScript设计模式初探
Jan 07 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
Javascript 字符串模板的简单实现
Feb 13 Javascript
javascript与jquery动态创建html元素示例
Jul 25 Javascript
js实现功能比较全面的全选和多选
Mar 02 Javascript
纯原生js实现贪吃蛇游戏
Apr 16 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
Mar 20 Javascript
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
vue2.0 如何在hash模式下实现微信分享
Jan 22 Javascript
express框架中使用jwt实现验证的方法
Aug 25 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的autoload自动加载机制使用说明
2010/12/28 PHP
php实现单链表的实例代码
2013/03/22 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
jQuery 选择器详解
2015/01/19 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
python url 参数修改方法
2018/12/26 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
python树的同构学习笔记
2019/09/14 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
药学专业大学生个人的自我评价
2013/11/04 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
服务承诺口号
2014/05/22 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
参观邀请函范文
2015/02/02 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
python异步的ASGI与Fast Api实现
2021/07/16 Python