【发布时间】:2011-02-22 00:13:52
【问题描述】:
我正在使用 jquery ui 选项卡并使用 .tabs('add'...) 动态添加选项卡。选项卡使用 ajax 加载 url。问题是每次我点击另一个标签然后回来......标签重新加载网址。我希望 url 加载一次......有什么想法吗?
【问题讨论】:
标签: javascript jquery dhtml jquery-ui-tabs
我正在使用 jquery ui 选项卡并使用 .tabs('add'...) 动态添加选项卡。选项卡使用 ajax 加载 url。问题是每次我点击另一个标签然后回来......标签重新加载网址。我希望 url 加载一次......有什么想法吗?
【问题讨论】:
标签: javascript jquery dhtml jquery-ui-tabs
请注意,选项卡选项的cache 属性在 jQueryUI 1.9 中已被弃用,并在 1.10 中被删除。见jQueryUI 1.9 upgrade guide
现在推荐的处理方法是使用新的beforeLoad 事件来阻止 XHR 请求运行。
$( "#tabs" ).tabs({
beforeLoad: function( event, ui ) {
if ( ui.tab.data( "loaded" ) ) {
event.preventDefault();
return;
}
ui.jqXHR.success(function() {
ui.tab.data( "loaded", true );
});
}
});
【讨论】:
我认为您正在寻找cache 选项(默认为false):
是否缓存远程标签 内容,例如仅加载一次或使用 每次点击。
例如:
$("#tabs").tabs({ cache:true });
这是一个简单的演示。使用 Firebug 或其他工具确保每个选项卡不会多次检索内容:http://jsfiddle.net/andrewwhitaker/D6qkW/
【讨论】:
打开选项卡上的缓存,或者启用 jQuery 中的全局 ajax 缓存选项,当发生需要重新加载的更改时,动态地将 Math.Rand() 之类的内容附加到 URL 的末尾,这样它就不会缓存下一次加载。
来自用于标签缓存的 jQuery 站点:
Code examples Initialize a tabs with the cache option specified. $( ".selector" ).tabs({ cache: true }); Get or set the cache option, after init. //getter
var cache = $( ".selector" ).tabs( "option", "cache" );
//setter
$( ".selector" ).tabs( "option", "cache", true );
【讨论】:
使用变量来存储布尔值。最初设置为 false(未加载 ajax)。当您的 ajax 加载时,将布尔值设置为 true 并在每个 ajax 请求之前检查该值。
当然,您需要做更多的工作来处理多个选项卡。
【讨论】:
$(function () {
$("#tabs").tabs({
beforeLoad: function (event, ui) {
if (ui.tab.data("loaded")) {
event.preventDefault();
return;
}
ui.ajaxSettings.cache = false,
ui.panel.html('<img src="images/prettyPhoto/dark_square/loader.gif" width="24" height="24" style="vertical-align:middle;"> Loading...'),
ui.jqXHR.success(function() {
ui.tab.data( "loaded", true );
}),
ui.jqXHR.error(function () {
ui.panel.html(
"Couldn't load Data. Plz Reload Page or Try Again Later.");
});
}
});
});
【讨论】:
从 jQuery 3.0 开始,jqXHR.success 已被删除,现在解决方案(修改形式为上面的 CheekySoft)
$('#tabs').tabs({
beforeLoad: function(event,ui){
if(ui.tab.data("loaded")){
event.preventDefault();
return;
}
},
load: function(event,ui){
ui.tab.data("loaded",true);
}
});
【讨论】:
将您的 AJAX 调用包装在 if 语句中,该语句检查之前的 AJAX 调用,即:
var ajaxed = false
if ( ajaxed == false ) {
// your ajax call
$.ajax({
type: "GET",
url: "test.js",
dataType: "html"
success: function(data){
// insert html into DOM
ajaxed = true
}
});
}
【讨论】:
我发现同样问题的解决方案是完美的答案,请选择以下链接:
$( "#tabs" ).tabs({
beforeLoad: function( event, ui ) {
if ( ui.tab.data( "loaded" ) ) {
event.preventDefault();
return;
}
ui.jqXHR.success(function() {
ui.tab.data( "loaded", true );
});
}
});
Deprecated ajaxOptions and cache options added beforeLoad event
【讨论】: