Вызов функции Javascript из хеш-значения с пространствами имен

В настоящее время у меня есть этот код для вызова функции из хеш-значения при загрузке страницы:

$(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 ответа

Решение

Это должно работать:

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

В JavaScript точечные обозначения и квадратные скобки являются взаимозаменяемыми, если ключ является допустимым идентификатором JavaScript. (В противном случае вы должны использовать квадратные скобки.)

Так что вы также можете сделать это (хотя точечная запись более читабельна):

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

Я использую аналогичный метод, где я храню значения объекта в хэш.

Моя техника:

  • используйте точку в хэше, чтобы показать иерархию - в вашем случае: #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]];
}

Единственным ограничением является то, что, конечно, имена ваших методов не должны содержать точку.

Я не фанат, но 'eval' может сработать:

eval(hash + "()");

Пример: http://jsfiddle.net/pGktd/

Другие вопросы по тегам