2012-01-14 2 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) я не могу использовать переменную ContextMenu позже в .click коде. Однако, если CreateContext вызывается дважды, все работает нормально. Я получаю неопределенную переменную, когда i 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

+0

nevermind. отлично работает, спасибо :) – user1027620

+1

@ user1027620 - Вы создаете и добавляете его, но вы не устанавливали значение локальной переменной 'ContextMenu' после его создания, чтобы остальная часть кода не могла использовать тот, который вы только что создали , Обратите внимание, как мой предложенный код устанавливает значение 'ContextMenu' при его создании. – jfriend00

1

Попробуйте использовать индикатор jQuery из вашей функции. Поскольку вы объявили переменную как объект jQuery, я не считаю, что вам нужно идентифицировать ее как объект jQuery AGAIN в вашей функции.

Смежные вопросы