Javascript路由/网址到功能

时间:2011-08-11 13:09:18

标签: javascript routes

我正在使用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中的命名函数?

3 个答案:

答案 0 :(得分:3)

您是否查看了Sinatra的JavaScript对应部分SammyJS ... * BA-达姆,tish *

答案 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是一个框架的例子,可以让你轻松地做到这一点