使用命名空间从哈希值调用Javascript函数

3

我目前有这个代码,在页面加载时从哈希值中调用一个函数:

$(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命名空间的情况下解决此问题?

3个回答

4

这应该可以工作:

$(function() {
    var hash = window.location.hash.substring(1);
    window.help[hash]();
});

在JavaScript中,点符号表示法和方括号表示法可互换使用,只要键是一个有效的JavaScript标识符即可。(否则,必须使用方括号。)
因此,你也可以使用以下方式(尽管点符号表示法更易读):
$(function() {
    var hash = window.location.hash.substring(1);
    window["help"][hash]();
});

太棒了,谢谢!我会尽快接受这个的。 - Hanna

1

我正在使用一种类似的方法,将对象值存储在哈希表中。

我的技术:

  • 在哈希表中使用点来显示层次结构 - 在您的情况下:#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]];
}

唯一的限制是,当然你的方法名称不应包含点号。

我真正喜欢这个解决方案的原因是它轻松允许多个命名空间,我可以重复使用相同的功能。感谢您的意见。谢谢! - Hanna
当然可以!实际上我用它来处理超过两个层级的一般情况(例如#help.faq.question1),但是这时代码会变得更加复杂,因为你需要添加验证步骤。 - Christophe
我正在考虑将一个Web项目转换为单页应用程序,使用这样的设置可以使JavaScript和Ajax映射到控制器和操作变得非常容易。 - Hanna

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接