2014-10-13 3 views
1

У меня есть следующие click события:Если функция не возвращает false?

$('#planung').click(function(){ 
    if($current != $('#planungtext')){ 
     console.log($current); 
     console.log($('#planungtext')); 
     $($current).removeClass('active'); 
     setTimeout(function(){$('#planungtext').addClass('active')}, 1000); 
     $current = $('#planungtext'); 
    } 
}); 

Я использовал журнал, чтобы увидеть содержимое моих переменного и '#planungtext' элемента. Они точно такие же, но функция if работает не так, как хотелось бы, поскольку она все еще идет в нее.

$ current не устанавливается перед первым щелчком элемента.

Я делаю что-то неправильно здесь?

+0

Что такое '$ current'? – jfriend00

+1

Хотя есть много обходных путей, правильный способ сравнить объекты jQuery * в jQuery * с помощью 'is': http://api.jquery.com/is/ Ответ добавлен ниже. –

ответ

4

Два объекта JQuery указывают на одних и тех же DOM элементов, но разные массивы (объекты JQuery, по существу, только массивы за кулисами с дополнительным материалом).

Использование JQuery ishttp://api.jquery.com/is/, чтобы проверить, если тот же селектор будет соответствовать им:

if(!$current.is('#planungtext')){ 

Самый быстрый способ сделать это проверить «вручную» является:

if ($current[0].id !== '#planungtext'){ 

Он упоминается в комментариях, что $ current - это переменная jQuery (хороший стандарт именования), но первоначально undefined, и в этом случае почти каждое обнаруженное решение будет аварийно завершено. Вам нужно инициализировать $ current для пустого объекта jQuery, чтобы обеспечить наиболее последовательное поведение (объекты jQuery никогда не должны быть неопределенными, чтобы их можно было использовать таким образом, иначе вам нужно их повторно обернуть, например, с помощью $($current), который я не рекомендую в качестве решения к неинициализированной переменной jQuery):

var $current = $(); // $() returns an empty jQuery object 
+0

Эй, это не сработает, потому что мой текущий ток определяется после первого щелчка мыши. Таким образом, консоль запускает «невозможно прочитать свойство неопределенного» или sth. –

+0

Initiallise $ current to '$()', который является пустым объектом jQuery. –

+0

Yey, спасибо! Я думаю, что это лучшее решение –

1

Предполагая, что $current является еще одним объектом jQuery, вы не можете сравнивать объекты, подобные этому. Однако вы можете сравнить их внутренние ценности. Изменение:

$current != $('#planungtext') 

To:

$current[0] != $('#planungtext')[0] 
+1

Вы можете объяснить «почему» вы не можете сравнить два объекта jQuery, как это, поэтому люди понимают, почему требуется ваше решение и почему вы можете сравнить два элемента DOM. – jfriend00

+0

Теперь консоль запускает «невозможно прочитать свойство неопределенного»? –

+2

OP оставил небольшую деталь, что '$ current' является и переменной jQuery, и не инициализируется, поэтому произойдет сбой на' [0] '. –

0

Если ваш сравнения входной элемент 2 HTML, вы можете проверить только ID атрибут.

С #planungtext - это уже уникальный идентификатор.

$($current).attr('id') !== 'planungtext' 
+1

Атрибут 'id' никогда не будет иметь ведущего символа #. ОП должен был изменить его работу. –

+0

О да, прости. Забыл сказать это. # Неправильно, конечно. Пожалуйста, отредактируйте свой ответ –

+0

Существует также избыточный '$()' around' $ current' (переменная с префиксом $, как правило, представляет собой объекты jQuery. –

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