2013-12-03 3 views
-1

Я новичок в jQuery и экспериментирую с некоторыми плагинами. Я нашел один под названием jQuery Balloon. Когда я добавляю свой скрипт и запускаю код, пузырь всплывает, но не исчезнет.не может заставить функцию переключения работать

Вот мой код:

<script type="text/javascript" src="/js/jquery.js"></script> 
    <script type="text/javascript" src="/js/jquery.balloon.min.js"></script> 

Вот мой JQuery код. Я опустил document.ready, потому что у меня есть это в верхней части моего документа.

$("a").click(function(event){ 
    $(this).showBalloon().toggle(); 
    event.preventDefault(); 

Как получить воздушный шар всплывающее окно, когда пользователь нажимает на ссылку и он уходит, когда они щелкают от него?

+0

вероятность того, что вы неправильно используете плагин с воздушным шаром. Отправьте ссылку на свой источник. – Alnitak

+0

Is showBalloon() возвращает объект jq? –

+0

(см. Также добавление 'jsfiddle') –

ответ

0
$('a').on('click', (function balloonState(){ 
    var state = true; 

    return function(ev) { 
     var $this = $(this); 

     if (state) { 
      $this.showBalloon(); 
     } else { 
      $this.hideBalloon(); 
     } 

     state = !state; 

     ev.preventDefault(); 
    } 
}())); 

ответ Альнитак является функционально совершенным, насколько идет речь, но вы можете достичь того же с простыми носителями закрытий (без использования $.fn.data), преимущества которых являются:

  • Сохранение на коде выполнение, избегая JQuery DOM-ассоциированный с привязкой данных и только декларирование state раз
  • Избегайте понапрасну состояние сохранения в DOM, где другой код сможет влиять с ним

EDIT: Как Альнитак отметил в комментариях, немедленно вызывается закрытие может создать только одну переменную для stateвсе<a> с. Если предположить, что это не то, что требуется, мы можем использовать JQuery-х каждый, чтобы создать закрытия для каждого <a>:

$('a').each(function balloonState(){ 
    var state = true; 
    var $this = $(this); 

    $this.on('click', function(ev) { 
     if (state) { 
      $this.showBalloon(); 
     } else { 
      $this.hideBalloon(); 
     } 

     state = !state; 

     ev.preventDefault(); 
    }); 
}); 

EDIT 2: Описанный выше метод имеет оговоркой, что она будет создавать новую функцию для каждой ссылки на странице во время выполнения, что очень расточительно с точки зрения управления памятью и быстрой инициализации. The plugin homepage uses the old jQuery toggle method to get around the problem of when to execute hideBalloon and showBalloon, но this was deprecated in jQuery 1.9. В целом я бы рекомендовал использовать Alnitak's method.

+0

Я принял ваш ответ, но есть ошибка, которую я хочу указать вам, вместо $ this.hideBalloon вы должны изменить ее на $ this.showBalloon – user3052886

+0

@ user3052886 ах! Хорошо подмечено. Исправлена. – Barney

+0

лошадей для курсов, как говорится. Недостатком этого метода является то, что каждый 'a' имеет одно и то же состояние. Это нормально, если это то, что требует OP, но я скорее подозреваю, что OP хочет независимые воздушные шары для каждой ссылки. – Alnitak

3

Вам нужно будет отслеживать состояние всплывающего окна, так как функции .toggle(fn1, fn2) теперь deprecated:

$('a').on('click', function(ev) { 
    var $this = $(this); 
    var state = !$this.data('balloon'); // use .data, initially undefined 
    if (state) { 
     $this.hideBalloon(); 
    } else { 
     $this.showBalloon(); 
    } 
    $this.data('balloon', state); 
    ev.preventDefault(); 
}); 

Обратите внимание, что это будет поддерживать отдельное состояние для каждого a звена.

+0

+1 Вы не хотите отрицать значение состояния перед его установкой –

+0

@ArunPJohny oops, да, действительно, спасибо! – Alnitak

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