2012-01-14 63 views
0
$('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'); 

等等玩弄jQuery对象和变量

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)我不能在.click代码中使用的变量ContextMenu以后。但是,如果CreateContext被调用两次,一切正常。当我第一次遇到一个未定义的变量时,我就是console.log(ContextMenu)。第二次正确获取对象。我怎样才能解决这个问题?谢谢。

回答

2

这是因为div#ContextMenu不存在你第一次打电话的createContext。事实上,你的功能检测到这种情况,然后创建它。但是,在创建它之后,您不会在函数内部填充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对象。

+0

但我创建并追加到身体上的第一个电话...... – user1027620 2012-01-14 00:34:18

+0

请不要介意。工作很好,谢谢:) – user1027620 2012-01-14 00:39:17

+1

@ user1027620 - 您正在创建并追加它,但创建后并没有设置局部变量'ContextMenu'的值,因此剩下的代码无法使用刚才创建的那个。请注意,我建议的代码在创建时如何设置“ContextMenu”的值。 – jfriend00 2012-01-14 00:40:25

1

尝试采取jQuery的指标你的功能。既然你已经把变量声明为一个jQuery对象,我不相信你需要在你的函数中将它识别为一个jQuery对象AGAIN。