jQuery 弹出窗口在第一次点击时不起作用
jQuery popup doesn't work at the first click
我有几个不同文章的 "Purchase Now" 按钮。当按钮有 class "sold-out" 时,它不应该做任何事情,否则它应该打开一个 jQuery Magnific Popup。这通常有效,但由于我使用事件处理程序 "Click" 而不是 "mousedown",因此只有在第二次单击后才会打开宏伟的弹出窗口。我不知道如何解决它。我猜是因为初始化什么的,但我不明白。
我的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
});
});
JSFiddle:http://jsfiddle.net/fyLgp1yx/
如您所见,它仅在第二次点击时尝试访问 ajax 内容(当然这里不起作用)。
这里发生的事情是 link 还没有绑定到 magnificPopup,当你第一次点击它时。那么,再点击,就执行了。
element.magnificPopup()
不应包含在点击事件中,因为调用它实际上是绑定事件,而不是执行事件。
所以你需要使用$.magnificPopup.open()
,像这样:
var serialize = function(obj) {
var str = [];
for(var p in obj)
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
}
$('.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 data = {
region : $(this).data('region'),
quantity : $(this).data('quantity'),
packageid : $(this).data('packageid')
};
if(typeof data.quantity == 'undefined') data.quantity = $(this).parent().find('select').val();
$.magnificPopup.open({
items:{
src:$(this).attr('href') + '?' + serialize(data),
type: 'ajax',
closeOnContentClick: false,
closeOnBgClick: false
}
});
});
我无法找到一种方法来 post 与常规 Ajax 一样的数据,因此我通过将数据附加到 URL(GET 请求),如果这对你有用的话。
我有几个不同文章的 "Purchase Now" 按钮。当按钮有 class "sold-out" 时,它不应该做任何事情,否则它应该打开一个 jQuery Magnific Popup。这通常有效,但由于我使用事件处理程序 "Click" 而不是 "mousedown",因此只有在第二次单击后才会打开宏伟的弹出窗口。我不知道如何解决它。我猜是因为初始化什么的,但我不明白。
我的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
});
});
JSFiddle:http://jsfiddle.net/fyLgp1yx/
如您所见,它仅在第二次点击时尝试访问 ajax 内容(当然这里不起作用)。
这里发生的事情是 link 还没有绑定到 magnificPopup,当你第一次点击它时。那么,再点击,就执行了。
element.magnificPopup()
不应包含在点击事件中,因为调用它实际上是绑定事件,而不是执行事件。
所以你需要使用$.magnificPopup.open()
,像这样:
var serialize = function(obj) {
var str = [];
for(var p in obj)
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
}
$('.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 data = {
region : $(this).data('region'),
quantity : $(this).data('quantity'),
packageid : $(this).data('packageid')
};
if(typeof data.quantity == 'undefined') data.quantity = $(this).parent().find('select').val();
$.magnificPopup.open({
items:{
src:$(this).attr('href') + '?' + serialize(data),
type: 'ajax',
closeOnContentClick: false,
closeOnBgClick: false
}
});
});
我无法找到一种方法来 post 与常规 Ajax 一样的数据,因此我通过将数据附加到 URL(GET 请求),如果这对你有用的话。