从带有命名空间的哈希值调用 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 组件?

如何避免javascript命名空间冲突?

使用命名空间调用 jquery

Laravel - 使用 Javascript 调用带有所需参数的路由

从编码的哈希值派生 Argon2 类型是不是安全?

带有自定义命名空间的jQuery应用程序