【问题标题】:Calling a Javascript function from a hash value with namespaces从带有命名空间的哈希值调用 Javascript 函数
【发布时间】: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 的情况下解决此问题?

【问题讨论】:

    标签: javascript javascript-namespaces


    【解决方案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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2017-10-24
      相关资源
      最近更新 更多