我正在尝试拼凑一个用于javascript的php风格包含功能。我正在采取的路线是通过XMLHttpRequest。将加载包含的文件,但该文件中的函数不可用,因为它们的作用域仅限于调用它们的函数。
我遇到了this article,它实现了类似的目标,但要求编码人员提前指定他们需要的功能,而我想简单地包含一个文件并自动添加窗口对象的功能。
这是我的进步
function twinkle(){
getXMLHTTPObj("twinkle/test.js");
// A simple function inside test.js
includedFunc();
}
// XMLHttp Stuff lifted from he Apple tutorial
var req;
function getXMLHTTPObj(url) {
req = false;
// branch for native XMLHttpRequest object
if(window.XMLHttpRequest && !(window.ActiveXObject)) {
try {
req = new XMLHttpRequest();
} catch(e) {
req = false;
}
// branch for IE/Windows ActiveX version
} else if(window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
req = false;
}
}
}
if(req) {
req.onreadystatechange = processReqChange;
// Set to False so javascript waits for the included functions
// to become available
req.open("GET", url, false);
req.send("");
}
return req;
}
function processReqChange() {
// only if req shows "loaded"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
eval(req.responseText);
} else {
alert("There was a problem retrieving the XML data:\n" +
req.statusText);
}
}
}
我正在考虑在每个包含的文件中创建一个函数索引,当包含该文件时可以迭代它,但这不是一个优雅的解决方案。
有什么想法吗?是否有一些我可以访问的javascript属性或函数来获取文件中的函数列表?
答案 0 :(得分:1)
为什么不创建<script>
标签并将其插入页面,而不是通过AJAX加载JavaScript文件?这将允许在全局范围内解析JavaScript。看一下Scriptaculous'require
函数如何工作
答案 1 :(得分:1)
更改声明函数的方式,它应该解决范围问题。而不是:
function add(a, b)
{
return a + b;
}
这样做:
var add = function(a, b)
{
return a + b;
}
答案 2 :(得分:1)
使用DOM添加所需的脚本非常简单:
function include(jsFile)
{
var sEl = document.createElement("script");
sEl.type = "text/javascript";
sEl.src = jsFile;
document.getElementsByTagName("head").appendChild(sEl);
}
浏览器甚至会异步下载此文件,并且脚本元素的onload
事件在大多数(所有?)流行的浏览器中都有效,因此如果您愿意,还可以添加回调函数。明显的缺点是,在下载和解析文件之前,函数不会对当前脚本可用。
答案 3 :(得分:1)
OrbMan在这个问题上向我指出了正确的方向,但是这种包含Javascript文件的特定方法的解决方案要求以不同的方式定义函数;像这样
window.myFunction = function(){
alert("Hey There!")
}
这方面的一个潜在好处是,所包含的文件中被声明为正常方式的任何函数都被封装,因此它们仅可用于该文件中的window.functions ...据我所知。