我想通过ajax(使用jQuery)从文本文件加载javascript函数,但似乎无法正确使用它。
这是我想从文本文件(abc.js)加载的javascript函数:
function my_alert() { alert 1; }
这是我使用ajax读取文件的方式:
$.getScript('abc.js', function (script) {
var loaded_function = ???
});
如何分配loaded_function以便我可以使用my_alert
来呼叫loaded_function.my_alert()
?
修改
我不想创建新的<script>
代码或使用$.getScript
的原因是my_alert
生活在全局范围内。我希望它只存在于{ }
函数范围内。
这可能吗?
答案 0 :(得分:0)
如何分配loaded_function以便我可以使用loaded_function.my_alert()调用my_alert?
使用此
的模块模式# this is the module
function my_alert(){
// Private section
var loaded_function = ...
// Public section which any instance can have access to
return{
loaded_function: loaded_function
};
}
Demo code:
强> var my_alert = (function() {
// Private section
function private() {
console.log('Private function ...')
}
// Public section which any instance can have access to
return {
public: private
};
})();
my_alert.public();
加载JS文件并存储它:
(function(url, callback){
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
// Your file data is now in the :
// this.responseText;
}
}
xhr.open("GET", url, true);
xmlHTTP.send();
})("url");
答案 1 :(得分:-1)
您使用eval (这是危险的),如下所示:
$.getScript('abc.js', function (script) {
var loaded_function = eval(script);
});
或您可以使用正常的分配方法
*仅当脚本包含类似
的函数定义时,此方法才有效function myFunction(){/* some code*/}
代码将是:
$.getScript('abc.js', function () {
var loaded_function= myFunction; //not = myFunction()
});
答案 2 :(得分:-1)
将函数包装在对象中是一种很好的做法。这样你就可以拥有例如:
var exposed = {
myFunc: function () {}
}
因此,'script'应该是函数,并将它分配给var应该暴露其范围。
var loaded_function = script.exposed
要打电话:
loaded_function.myFunc();
答案 3 :(得分:-1)
您可以使用此代码:
$.get('abc.js', function(script) {
var loaded_function = {};
var function_list = [];
// save names of defined functions
for (var key in window) {
if (typeof window[key] == 'function' && !window[key].toString().match(/\[native code\]/)) {
function_list.push(key);
}
}
// use global eval https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
var geval = eval;
geval(script);
for (var key in window) {
if (typeof window[key] == 'function' && !window[key].toString().match(/\[native code\]/) &&
function_list.indexOf(key) == -1) {
loaded_function[key] = window[key];
delete window[key];
}
}
console.log(loaded_function.my_alert);
}, 'text');