我正在使用jQuery构建一个Javascript / AJAX重型Web应用程序,我正在寻找一种将URL /路由映射到Javascript函数的方法。我正在使用HTML5历史API和一些重写规则,所以所有请求都将转到一个HTML文件,但理想的是我想要做的是
Routes.add('/some/path/', 'func_somepath');
Routes.add('/someother/path/', 'func_someotherpath');
function func_somepath(){
alert("You're at somepath");
}
function func_someotherpath(){
alert("You're at someotherpath");
}
然后当有人访问example.com/some/path/时,将调用函数'func_somepath',类似于/ someother / path /。能够在URL
中使用Rails样式或正则表达式变量也是很好的Routes.add('/items/([a-z]+)', 'func_items');
func_items(id){
alert('You requested '+id+'!');
}
这样的事情是否已经存在或我是否必须自己编写?我不介意自己写,但如果已经存在某些东西那就没有意义了。我还想避免使用'exec',那么我将如何调用Routes.add中的命名函数?
答案 0 :(得分:3)
答案 1 :(得分:3)
除非绝对,否则不要使用eval 没有其他选择。
正如已经提到的,使用这样的东西是最好的方法:
window["functionName"](arguments);
然而,这不适用于命名空间函数:
window["My.Namespace.functionName"](arguments); // fail
这就是你要做的:
window["My"]["Namespace"]["functionName"](arguments); // succeeds
为了使这更容易并提供一些灵活性,这里有一个便利功能:
function executeFunctionByName(functionName, context /*, args */) {
var args = Array.prototype.slice.call(arguments).splice(2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(this, args);
}
你会这样称呼它:
executeFunctionByName("My.Namespace.functionName", window, arguments);
注意,你可以传入你想要的任何上下文,所以这将与上面相同:
executeFunctionByName("Namespace.functionName", My, arguments);
希望有帮助...
答案 2 :(得分:0)
Ember.js,senchatouch2,extjs4是一个框架的例子,可以让你轻松地做到这一点