从带有命名空间的哈希值调用 Javascript 函数
Posted
技术标签:
【中文标题】从带有命名空间的哈希值调用 Javascript 函数【英文标题】:Calling a Javascript function from a hash value with namespaces 【发布时间】:2013-02-15 07:21:49 【问题描述】:我目前有这段代码可以在页面加载时从哈希值调用函数:
$(function()
var hash = window.location.hash.substring(1);
window[hash]();
);
这很好用。
但是,我的 javascript 在命名空间中是这样的:
var help =
faq: function ()
//do stuff
,
newFeatures: function ()
//do stuff
我在顶部列出的函数不适用于命名空间的 javascript。我试过手动将命名空间添加到前面(所以var hash = "help." + window.location.hash.substring(1);
),但没有奏效。
如何在不从命名空间中删除我的 Javascript 的情况下解决此问题?
【问题讨论】:
【参考方案1】:这应该可行:
$(function()
var hash = window.location.hash.substring(1);
window.help[hash]();
);
在 JavaScript 中,点表示法和方括号可以互换,只要键是有效的 JavaScript 标识符。 (否则,您必须使用方括号。)
所以你也可以这样做(虽然点符号更易读):
$(function()
var hash = window.location.hash.substring(1);
window["help"][hash]();
);
【讨论】:
这很棒。谢谢!我会尽快接受。【参考方案2】:我正在使用类似的方法,将对象值存储在哈希中。
我的技术:
在散列中使用一个点来显示层次结构 - 在您的情况下:#help.faq 运行脚本来转换点符号并检索实际值现场演示:http://jsfiddle.net/Kn4w2/1/
代码示例:
var hashArray=hash.split("."),
myMethod=window;
for (var i=0;i<hashArray.length;i++)
myMethod=myMethod[hashArray[i]];
唯一的限制是你的方法名当然不能包含点。
【讨论】:
我真正喜欢这个解决方案的地方在于它很容易允许多个命名空间,并且我可以重用相同的功能。感谢您的意见。谢谢! 绝对!我实际上将它用于具有两个以上级别的一般情况(例如#help.faq.question1),但是由于您需要添加验证步骤,因此代码变得更加复杂。 我实际上正在考虑将一个 Web 项目变成一个单页应用程序,并且这样的设置将使用 javascript 和 ajax 非常容易地映射到控制器和操作。【参考方案3】:我不是一个真正的粉丝,但 'eval' 可能会起作用:
eval(hash + "()");
示例:http://jsfiddle.net/pGktd/
【讨论】:
以上是关于从带有命名空间的哈希值调用 Javascript 函数的主要内容,如果未能解决你的问题,请参考以下文章
使用 Saxon-JS 及其全局 Javascript 函数命名空间在 XSL 中调用 jQuery-UI 组件?