当通过 ajax 加载 HTML/LINK 时,jQueryTOOLS 叠加灯箱无法正常工作
jQueryTOOLS Overlay lightbox not functioning when HTML/LINK is loaded via ajax
在开始之前,我研究并发现了这个类似的上一个问题:Reinitialize jQuerytools Overlay on ajax loaded element
但是,该问题的 "answer" 建议使用 .live()。我试图让我们 jQuery 1.9 .live() is not a function 使用 .on() 进行更新。
$(".overlay_load[rel]").on('click', 'a', function () {
$(this).overlay().load();
$(this).overlay().load();
return false;
});
我承认我不能 100% 完全理解它在做什么,也许 re-initializing 新加载的 HTML 使得 jQueryTOOLS Overlay 具有 'access' 到新加载的 HTML.
我有一个页面通过 AJAX 加载了 HTML 内容的部分。这是加载的一个 DIV 的示例。
<div class="ajax-returned mytop">
<span class="username"> drkwong </span> <br>
<span class="full-name">Andrew Kwong</span><br>
<span class="action-status">
<span class="mt-icon ut3"></span>
<span class="autoship active">A</span>
<span class="view_profile">
<a href="/member/downline_tree_view/?view=tree_profile&program=1&view_userid=13" rel="#overlay">
<img src="/inc/downline_tree/images/more_info.png" rel="#13">
</a>
</span>
</span>
</div>
<!-- overlayed element -->
<div class="apple_overlay" id="overlay">
<!-- the external content is loaded inside this tag -->
<div class="contentWrap"></div>
</div>
这有一个 link,它应该与 jQuery 互动,然后加载一个 jQueryTOOLS 叠加灯箱:
<script>
$(function() {
// if the function argument is given to overlay,
// it is assumed to be the onBeforeLoad event listener
$("a[rel]").overlay({
mask: 'grey',
effect: 'apple',
onBeforeLoad: function() {
// grab wrapper element inside content
var wrap = this.getOverlay().find(".contentWrap");
// load the page specified in the trigger
wrap.load(this.getTrigger().attr("href"));
}
});
});
</script>
这是我用来将外部页面加载到灯箱中的 jQuery:http://jquerytools.github.io/demos/overlay/external.html
只是感觉没有触发jQuery。
这是 header 中的内容:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="/templates/public/2/downline/js/jquery.browser.min.js"></script>
<script type="text/javascript" src="/templates/public/2/downline/js/jquery.tools.min.js"></script>
jQueryTOOLS Overlay 需要 jquery.browser.min.js 才能访问浏览器。 https://github.com/gabceb/jquery-browser-plugin
编辑:
AJAX
var ids=new Array()
var node
var param={"action":"NodeDetailAll","admin":"1"}
var users=new Array()
function get_ids(){
for(var i=0;i<nodes.length;i++){
users.push("child_"+$(nodes[i]).attr("class"))
ids.push($(nodes[i]).attr("class"))
}
}
function get_nodes(){
nodes = $("#chart [myattr*='descendent']")
nodes= jQuery.makeArray(nodes);
$.when(get_ids()).then(function(){
$.each(ids,function(key,value){
param[users[key]]=value
})
})
}
function write_html(response){
$.each(response,function(key,value){
$("."+key).html(value)
})
}
jQuery(document).ready(function() {
$(".spinner-loader").fadeIn(200)
$.when(get_nodes()).then(function(){
$.post("~ajax_url~",param,function(response) {
response=jQuery.parseJSON(response)
$.when(write_html(response)).done(function() {
$(".spinner-loader").fadeOut(600)
$("#chart").css("opacity","1")
// is this where I would add the on()? //
// I tried that, without success. //
// perhaps I need to modify the on() function? //
})
})
})
})
您可以在 ajax 函数的回调中调用覆盖绑定。另一件事是检查您的 jQuery 选择器,以确保您对它们进行了适当的配置,并且它们正在选择适当的元素来绑定您的事件。
根据 jQuery 文档:"Event handlers are bound only to the currently selected elements; they must exist on the page at the time your code makes the call to .on()."
所以在我看来,在您的 AJAX 请求的回调中调用绑定功能是可行的方法!也许如果您可以提供代码的简化版本,包含 ajax 请求,那么我可以尝试再看一眼 :)
使用不同的解决方案。 jQueryTOOLS Overlay 不再有效,并使用已弃用甚至被淘汰的 jQuery 功能。尝试解决所有这些问题已被证明效率低下,就 AJAX 而言,最新版本的 jQuery.
是不可能的
按照@sparky 的建议FancyBox 2 提供了所需的解决方案。实施起来简单直观。
在开始之前,我研究并发现了这个类似的上一个问题:Reinitialize jQuerytools Overlay on ajax loaded element
但是,该问题的 "answer" 建议使用 .live()。我试图让我们 jQuery 1.9 .live() is not a function 使用 .on() 进行更新。
$(".overlay_load[rel]").on('click', 'a', function () {
$(this).overlay().load();
$(this).overlay().load();
return false;
});
我承认我不能 100% 完全理解它在做什么,也许 re-initializing 新加载的 HTML 使得 jQueryTOOLS Overlay 具有 'access' 到新加载的 HTML.
我有一个页面通过 AJAX 加载了 HTML 内容的部分。这是加载的一个 DIV 的示例。
<div class="ajax-returned mytop">
<span class="username"> drkwong </span> <br>
<span class="full-name">Andrew Kwong</span><br>
<span class="action-status">
<span class="mt-icon ut3"></span>
<span class="autoship active">A</span>
<span class="view_profile">
<a href="/member/downline_tree_view/?view=tree_profile&program=1&view_userid=13" rel="#overlay">
<img src="/inc/downline_tree/images/more_info.png" rel="#13">
</a>
</span>
</span>
</div>
<!-- overlayed element -->
<div class="apple_overlay" id="overlay">
<!-- the external content is loaded inside this tag -->
<div class="contentWrap"></div>
</div>
这有一个 link,它应该与 jQuery 互动,然后加载一个 jQueryTOOLS 叠加灯箱:
<script>
$(function() {
// if the function argument is given to overlay,
// it is assumed to be the onBeforeLoad event listener
$("a[rel]").overlay({
mask: 'grey',
effect: 'apple',
onBeforeLoad: function() {
// grab wrapper element inside content
var wrap = this.getOverlay().find(".contentWrap");
// load the page specified in the trigger
wrap.load(this.getTrigger().attr("href"));
}
});
});
</script>
这是我用来将外部页面加载到灯箱中的 jQuery:http://jquerytools.github.io/demos/overlay/external.html
只是感觉没有触发jQuery。
这是 header 中的内容:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="/templates/public/2/downline/js/jquery.browser.min.js"></script>
<script type="text/javascript" src="/templates/public/2/downline/js/jquery.tools.min.js"></script>
jQueryTOOLS Overlay 需要 jquery.browser.min.js 才能访问浏览器。 https://github.com/gabceb/jquery-browser-plugin
编辑:
AJAX
var ids=new Array()
var node
var param={"action":"NodeDetailAll","admin":"1"}
var users=new Array()
function get_ids(){
for(var i=0;i<nodes.length;i++){
users.push("child_"+$(nodes[i]).attr("class"))
ids.push($(nodes[i]).attr("class"))
}
}
function get_nodes(){
nodes = $("#chart [myattr*='descendent']")
nodes= jQuery.makeArray(nodes);
$.when(get_ids()).then(function(){
$.each(ids,function(key,value){
param[users[key]]=value
})
})
}
function write_html(response){
$.each(response,function(key,value){
$("."+key).html(value)
})
}
jQuery(document).ready(function() {
$(".spinner-loader").fadeIn(200)
$.when(get_nodes()).then(function(){
$.post("~ajax_url~",param,function(response) {
response=jQuery.parseJSON(response)
$.when(write_html(response)).done(function() {
$(".spinner-loader").fadeOut(600)
$("#chart").css("opacity","1")
// is this where I would add the on()? //
// I tried that, without success. //
// perhaps I need to modify the on() function? //
})
})
})
})
您可以在 ajax 函数的回调中调用覆盖绑定。另一件事是检查您的 jQuery 选择器,以确保您对它们进行了适当的配置,并且它们正在选择适当的元素来绑定您的事件。
根据 jQuery 文档:"Event handlers are bound only to the currently selected elements; they must exist on the page at the time your code makes the call to .on()."
所以在我看来,在您的 AJAX 请求的回调中调用绑定功能是可行的方法!也许如果您可以提供代码的简化版本,包含 ajax 请求,那么我可以尝试再看一眼 :)
使用不同的解决方案。 jQueryTOOLS Overlay 不再有效,并使用已弃用甚至被淘汰的 jQuery 功能。尝试解决所有这些问题已被证明效率低下,就 AJAX 而言,最新版本的 jQuery.
是不可能的按照@sparky 的建议FancyBox 2 提供了所需的解决方案。实施起来简单直观。