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设计模式 接口介绍
Jul 24 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
Jan 17 Javascript
javascript检测是否联网的实现代码
Sep 28 Javascript
JQuery 使用attr方法实现下拉列表选中
Oct 13 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
Jun 07 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
Jun 08 Javascript
layui 实现加载动画以及非真实加载进度的方法
Sep 23 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 Javascript
JavaScript进阶(一)变量声明提升实例分析
May 09 Javascript
在vue中使用vant TreeSelect分类选择组件操作
Nov 02 Javascript
js动态生成表格(节点操作)
Jan 12 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
SONY SRF-M100的电路分析
2021/03/02 无线电
CodeIgniter中实现泛域名解析
2014/07/19 PHP
浅谈json_encode用法
2015/03/05 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python基本语法经典教程
2016/03/11 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
python3处理含有中文的url方法
2018/05/10 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
django queryset相加和筛选教程
2020/05/18 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
房产公证书范本
2014/04/10 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
详解Python中的for循环
2022/04/30 Python
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript