为什么无法访问分配了jquery对象的函数内部变量

时间:2013-08-09 21:53:27

标签: javascript

我无法访问函数内的buttoncontainer变量。有什么问题?

var Site = {
    init: function () {
        $(".site .head .nav-bar .nav-button").click(function () {
            Site.Navigation.toggle();
            return false;
        });
    },
    Navigation: {
        container: $(".site .head .nav-bar .navigation"),
        button: $(".site .head .nav-bar .nav-button"),
        toggle: function () {
            if (this.button.hasClass("active")) {
                this.hide();
            }
            else {
                this.show();
            }
        },
        show: function () {
            this.button.addClass("active");
            this.container.slideDown();
            return false;
        },
        hide: function () {
            this.button.removeClass("active");
            this.container.slideUp();
            return false;
        }
        //another stuff
    }

}

$(document).ready(function () {
    Site.init();
});

2 个答案:

答案 0 :(得分:4)

我不是很确定,但我相信正在发生的事情是你的选择器不匹配任何元素,因为它们是在元素添加到DOM之前调用的。我是说这些:

container: $(".site .head .nav-bar .navigation"),
button: $(".site .head .nav-bar .nav-button"),

尝试将整个JavaScript移动到正文的末尾(就在</body>之前)。

另一种可能的解决方案是仅从Site.init填充这些属性(目前,当声明对象文字时,它们会立即填充:

var Site = {
    init: function () {

        this.Navigation.container = $(".site .head .nav-bar .navigation");
        this.Navigation.button = $(".site .head .nav-bar .nav-button");

        $(".site .head .nav-bar .nav-button").click(function () {
            Site.Navigation.toggle();
            return false;
        });
    },
    Navigation: {
        container: null,
        button: null,
        toggle: function () {
            if (this.button.hasClass("active")) {
                this.hide();
            }
            else {
                this.show();
            }
        },
        show: function () {
            this.button.addClass("active");
            this.container.slideDown();
            return false;
        },
        hide: function () {
            this.button.removeClass("active");
            this.container.slideUp();
            return false;
        }
        //another stuff
    }

}

答案 1 :(得分:2)

这是因为你的元素在定义对象时可能还不存在,因为在DOM准备就绪后代码没有运行。

您可以修改Site.init函数以接受这些元素引用作为参数。

   init: function (container, button) {
        var nav = this.Navigation;

        nav.container = container;
        nav.button = button;
    }

然后传递元素:

$(document).ready(function () {
    Site.init(/*containerEl*/, /*buttonEl*/);
});