2012-01-14 58 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。