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脚本实现静态网页加密实例代码
Nov 05 Javascript
Javascript 遍历页面text控件详解
Jan 06 Javascript
js重写alert控件(适合学习js的新手朋友)
Aug 24 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
javascript实现俄罗斯方块游戏的思路和方法
Apr 27 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
JavaScript提升性能的常用技巧总结【经典】
Jun 20 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
Oct 26 Javascript
解决vue页面DOM操作不生效的问题
Mar 17 Javascript
Vue 让元素抖动/摆动起来的实现代码
May 31 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
微信小程序动态添加和删除组件的现实
Feb 28 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 array_filter除去数组中的空字符元素
2020/06/21 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
从javascript语言本身谈项目实战
2006/12/27 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
利用JS实现数字增长
2016/07/28 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
python连接sql server乱码的解决方法
2013/01/28 Python
python实用代码片段收集贴
2015/06/03 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python实现抽奖小程序
2020/04/15 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
在购买印度民族服饰:Soch
2020/09/15 全球购物
软件测试题目
2013/02/27 面试题
生产经理的自我评价分享
2013/11/07 职场文书
优秀部门获奖感言
2014/02/14 职场文书
车间主任岗位职责
2014/03/16 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
外贸英文求职信范文
2015/03/19 职场文书
高中家长意见怎么写
2015/06/03 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
Vue的过滤器你真了解吗
2022/02/24 Vue.js