玩jQuery对象和变量

时间:2012-01-14 00:31:24

标签: javascript jquery

    $('div#Settings ul li').click(function () {
        var url, template;
        var self = $(this);
        if (!$(self).hasClass('selected')) {
            var ContextMenu = CreateContext($(self));
            var id = $(self).attr('id');

等...

function CreateContext(item) {
        var ContextMenu = $('div#ContextMenu');
        if (!$(ContextMenu).length) {
            $('<div id="ContextMenu"></div>').appendTo('body');
            CreateContext(item);
        }
        $(ContextMenu).slideUp(150, 'swing', function () {
            $(ContextMenu).insertAfter(item);
        });
        $(item).addClass('selected').siblings().removeClass('selected');
        return $(ContextMenu);
    }

第一次调用CreateContext(item)时,我无法在ContextMenu代码中使用变量.click。但是,如果CreateContext被调用两次,一切正常。第一次console.log(ContextMenu)时,我得到一个未定义的变量。第二次正确获取对象。我怎样才能解决这个问题?感谢。

2 个答案:

答案 0 :(得分:2)

这是因为第一次调用CreateContext时div#ContextMenu不存在。实际上,您的函数会检测到该条件,然后创建它。但是,在创建它之后,您不会在函数内填充ContextMenu的值,因此函数的其余部分无法正常工作。

以下是我的建议:

function CreateContext(item) {
    var ContextMenu = $('#ContextMenu');
    if (!ContextMenu.length) {
        ContextMenu = $('<div id="ContextMenu"></div>');
        ContextMenu.appendTo('body');
    }
    ContextMenu.slideUp(150, 'swing', function () {
        ContextMenu.insertAfter(item);
    });
    $(item).addClass('selected').siblings().removeClass('selected');
    return ContextMenu;
}

注意,一旦ContextMenu是一个jQuery对象,之后就不必用$()包围它,因为它已经是一个jQuery对象了。

答案 1 :(得分:1)

尝试从您的函数中取出jQuery指标。由于您已将变量声明为jQuery对象,因此我不相信您需要在函数中将其标识为jQuery对象。