【发布时间】:2017-11-20 16:45:28
【问题描述】:
我正在写一个插件(我写了很多),并决定第一次尝试 Fancybox 在弹出窗口中显示 png 图像。该插件适用于最初作为初始页面渲染一部分的 html,但我从 ajax 调用返回的相同 html 不会导致弹出窗口并且不会引发错误。
我的问题是:当 html 作为 ajax 调用的结果被注入 div 时,是否仍然可以使用 Fancybox 和 Thickbox 弹出窗口?如果是这样,这里有什么问题?
这就是我在 ajax 调用中创建 html 的方式:
$html = "
<div class='skTable'>
<div class='skTableHeading'>
<div class='skTableHead skQtyColumn'>#</div>
<div class='skTableHead skNameColumn'>Name</div>
<div class='skTableHead skImgColumn'>Image</div>
</div>
<div class='skTableBody'>";
foreach ( $itemList as $item ) {
$html .= "
<div class='skTableRow'>
<div class='skTableCell skQtyColumn'>$item->quantity</div>
<div class='skTableCell skNameColumn'>$item->itemName</div>
<div class='skTableCell skImgColumn'>
<div style='display:none'>
<div id='$item->itemCode-$item->itemNumber' style='width:245px;height:342px;'>
<img width='245' height='342' src='$item->imageUrl'>
</div>
</div>
<a class='itemShow' href='#$item->itemCode-$card->itemNumber'>View</a>
</div>
</div>";
}
$html .= "
</div>
</div>";
$results['html'] = $html;
$results['success'] = TRUE;
渲染初始页面的 html 使用完全相同的代码 - 并且初始渲染同样有效,但来自 ajax 调用的 html 无效。
我怀疑问题出在我的 jQuery 中,它位于一个单独的文件中:
jQuery(document).ready( function($) {
$('#ChoiceID').on( 'change', function () {
var valueSelect = $(this).val();
var ajaxurl = plugin_vars.ajax_url;
var ajax_nonce = plugin_vars.ajax_nonce;
$.ajax(ajaxurl, {
type: "POST",
dataType: 'json',
data: {
action: "getChoiceResult",
security: plugin_vars.ajax_nonce,
userChoice: valueSelect
},
success: function ( results ) {
var returnedHTML = results.html;
if ( results.success ) {
$('#ChoiceResult').html( returnedHTML );
} else {
$('#ChoiceResult').html( '<span>No results available: ' + valueSelect + '</span>' );
}
},
error: function ( errorThrown ) {
alert('error running');
alert("Error thrown: " + errorThrown);
} });
});
});
初始渲染还包含启动 ajax 调用并提供放置结果的位置的相关 html:
<div class="skTableCell">
<form action="" id="plugin_form">
<div class="skTable">
<div class="skTableRow">
<div class="skTableCell">
<label for="UserChoice" class="skLabel">Make a choice:</label>
</div>
<div class="skTableCell">
<select name="UserChoice" id="ChoiceID" class="skSelect">
<option value="NonChoice">--- Choose a deck! ---</option>
<option value='Choice1'>Choice 1</option>
<option value='Choice2'>Choice 2</option>
<option value='Choice3'>Choice 3</option>
</select>
</div>
</div>
</div>
</form>
</div>
<br/><br/>
<!-- where the response will be displayed -->
<div id="ChoiceResult"></div>
Wordpress 中的 Fancybox 设置检查了 Extra Calls,这些设置添加到 Fancybox jQuery:
jQuery(".itemShow").fancybox({
'scrolling' : 'no',
'titleShow' : false
});
jQuery(".modal").fancybox({ // for modals pages
'autoSize' : true,
'type' : 'ajax'
});
jQuery("#zoom").fancybox({ // for modal images
'autoScale' : true,
'transitionIn' : 'fade',
'transitionOut' : 'fade'
});
我加入的 CSS 只是格式化而不相关。
这就是我能想到的所有内容,但请不要犹豫,要求更多。错误日志无异常,浏览器控制台不报告任何错误。在初始渲染中单击 View 链接时,会显示 Fancybox 弹出窗口(当我尝试这样做时会显示一个厚框) - 但是由于 ajax 调用而注入到 ChoiceResult div 中的 html 不在 Fancybox 或内置厚盒。
提前感谢任何人都可以提供的任何启示。
【问题讨论】:
-
我认为这是上一个问题的重复 - stackoverflow.com/questions/47386229/…
-
当我看到你的笔记和链接时,我非常兴奋,因为我错过了那个,但唉,这不是。我尝试应用该选择器逻辑,但它仍然不起作用。这就是我所做的:` $().fancybox({ selector : 'a.itemShow', scrolling : 'no', titleShow : false }); ` 我尝试了许多不同的选项。
-
抱歉上面的格式。我忘了将代码缩进 4 个空格。
-
@Janis - 我确实发现了一个涉及 pre-version-2 fancybox 的问题,解决方案是:加载动态内容后,再次绑定 fancy box。还提到升级到 V2 可以解决这个问题。我想知道这是 V3 中的一个选项还是已删除。我不知道如何重新绑定 div 甚至尝试它,更不用说知道它是否相关。
-
我已经在上一个问题中解释过 - jQuery v3 删除了一项允许自动创建委托点击事件的功能。因此,这对 v2 停止工作,而 v3 使用这种新语法。因此,如果您使用的是 v2,则只需在将新元素附加到页面后调用
$(".itemShow").fancybox()。
标签: jquery ajax wordpress thickbox fancybox-3