jQuery всегда предотвращает действие первого клика

У меня есть несколько кнопок «Купить сейчас» разных статей. Когда кнопка имеет класс «распродано», она не должна ничего делать, иначе она должна открыть всплывающее окно jQuery Magnific. Пока это работает. Моя проблема в том, что когда я впервые нажимаю на домашнюю страницу доступную для покупки кнопку «Купить сейчас», она ничего не делает. Когда я нажимаю на него во второй раз, открывается окно jQuery. Но почему это не работает в первый раз уже??

Мой HTML:

<a href="payment_options.php" class="btn-1 ajax-popup" data-region="EUW" data-packageid="1" style="display: inline-block;">Purchase Now</a>

Мой JQuery:

$('.open-popup-link').magnificPopup({
  type:'inline',
  midClick: true,
  mainClass: 'mfp-fade'
});



$('.ajax-popup').click(function(e){
    e.preventDefault();

    if($(this).hasClass("sold-out")) {
        return false;
    }
    var region = $(this).data('region');
    var quantity = $(this).data('quantity');
    if(typeof quantity == 'undefined') quantity = $(this).parent().find('select').val();
    var packageid = $(this).data('packageid');

    $(this).magnificPopup({
      type: 'ajax',
      ajax: {
          settings: {
              data : {
                  region : region,
                  quantity : quantity,
                  packageid : packageid,
              }
          }
      },
      closeOnContentClick: false,
      closeOnBgClick: false
   });

});

person kentor    schedule 05.02.2015    source источник
comment
Вы устанавливаете magnificPopup для элементов только после того, как щелкнули по нему, поэтому он открывается только после второго щелчка.   -  person A. Wolff    schedule 05.02.2015
comment
Разве я не объявил это в первой части моего jQuery? Что мне делать, чтобы это исправить?? Когда я использую обработчик событий mousedown вместо обработчика событий click, он работает. Но мне нужен обработчик кликов   -  person kentor    schedule 05.02.2015
comment
Разве это не работает $('.ajax-popup').each(function(){$(this).magnificPopup(...);}); вне обработчика кликов?   -  person A. Wolff    schedule 05.02.2015
comment
Я не понимаю твоей идеи, А. Вольф? Что я должен указать внутри magnificPopup(...) ?   -  person kentor    schedule 05.02.2015
comment
Вместо обработчика кликов используйте каждый цикл для установки плагина с соответствующими данными.   -  person A. Wolff    schedule 05.02.2015
comment
Использование каждого в качестве обработчика событий больше не открывает всплывающее окно, но перенаправляет на страницу checkout.php, указанную в HTML. Я думаю, потому что preventDefault() больше не работает.   -  person kentor    schedule 05.02.2015
comment
Но вам все равно нужно предотвратить поведение щелчка по умолчанию... Используйте цикл each только для установки плагина, я думал, что это очевидно   -  person A. Wolff    schedule 05.02.2015
comment
Хорошо, когда я использую обработчик каждого события для инициализации всплывающего окна Magnific, сначала он говорит, что «Содержимое не найдено» для первого щелчка, и открывает правильное всплывающее окно при втором щелчке. Вот как я это сделал: pastebin.com/kVUk1md7 . До этого комментария я пробовал следующее: pastebin.com/RHpy8dHa   -  person kentor    schedule 05.02.2015
comment
Не могли бы вы вместо этого опубликовать jsFiddle, чтобы его можно было проверить? НО, вы все еще вспоминаете инициализацию плагина по клику, это не то, о чем я говорил. Кстати, вам нужно передавать определенные данные в каждом цикле. $('.ajax-popup').click(function(e){ e.preventDefault();}).each(function(){if($(this).hasClass("sold-out")) {...//all code here});   -  person A. Wolff    schedule 05.02.2015
comment
Вот скрипка. Контент не может быть загружен появляется только при втором щелчке. Может быть, вы можете предоставить мне рабочее решение с этим. Спасибо за вашу помощь! jsfiddle.net/fyLgp1yx   -  person kentor    schedule 06.02.2015


Ответы (2)


Это может быть связано с тем, что вы объявляете определение всплывающего окна в функции щелчка. Можете ли вы попробовать объявить функцию вне функции щелчка?

person ArinCool    schedule 05.02.2015
comment
@kentor Да, потому что mousedown запускается перед событием щелчка, которое используется для открытия всплывающего окна. Но тогда вы повторно инициализируете плагин при каждом нажатии мыши. - person A. Wolff; 05.02.2015

Он не открывается при первом щелчке, потому что это время, когда вы привязываете его к элементу.

Однако в документации мы видим, что можем мгновенно открыть MagnificPopup.

// Open popup immediately. If popup is already opened - it'll just overwite the content (but old options will be kept).
// - first parameter: options object
// - second parameter (optional): index of item to open
$.magnificPopup.open({
  items: {
    src: 'someimage.jpg'
  },
  type: 'image'

  // You may add options here, they're exactly the same as for $.fn.magnificPopup call
  // Note that some settings that rely on click event (like disableOn or midClick) will not work here
}, 0);

http://dimsemenov.com/plugins/magnific-popup/documentation.html#options

person Thelambofgoat    schedule 05.02.2015
comment
Я добавил .open в свою строку magnificPopup вот так $(this).magnificPopup.open({ . Ничего не изменилось. - person kentor; 05.02.2015
comment
Я попытался создать страницу с вашим кодом и добавить метод open() и могу сказать, что это решило проблему. jsbin.com/yepowicaza/1/edit?html,js (вы можете посмотрите мой тестовый код там, я только изменил ajax на встроенное всплывающее окно, чтобы упростить тестирование) - person Thelambofgoat; 05.02.2015
comment
$.magnificPopup.open({ ‹- эта строка выдает мне ошибку. Невозможно прочитать свойство, проанализированное как неопределенное. - person kentor; 05.02.2015
comment
Я просто изменил тип на ajax и запустил его, он также показывает все в порядке. Я думаю, что ваша проблема в том, что вы потеряли фрагменты кода. Что-то просто не загружается, когда оно выполняется в первый раз (и кажется, что это всплывающее окно). Например, попробуйте поместить весь код в конец файла. Готов поспорить на 95%, что проблема где-то здесь. - person Thelambofgoat; 05.02.2015
comment
Почему вы загружаете Popup дважды, минимизированную и полную версию? Это может быть причиной ошибок. И для браузера в любом случае они одинаковы. - person Thelambofgoat; 05.02.2015
comment
‹script src=js/jquery.magnific-popup.js›‹/script› ‹script src=js/jquery.magnific-popup.min.js›‹/script› - person Thelambofgoat; 05.02.2015
comment
Хорошо, я указал минимальную версию, но ошибка все та же. Но меня также интересует этот синтаксис, в котором возникает ошибка, которую никогда раньше не видели? - person kentor; 05.02.2015
comment
В нем говорится, что элемент не определен, и даже четко отображается строка `if(!item.parsed) { item = mfp.parseEl(mfp.index); }` теперь вам нужно понять, почему здесь не определено) кажется, вы пропустили некоторые настройки всплывающего окна - person Thelambofgoat; 06.02.2015