你是对的,它是 BASE 元标记。这是您在使用最新版本的 jQuery UI (1.9) 时会遇到的问题,它适用于 1.8。Tabs API 进行了很多更改,但在您检查 jQuery 源代码之前,似乎没有什么会导致此问题。
- BASE 元标记指示浏览器将选项卡中的 href 属性(您用作选项卡内容的参考)从 hash+id 转换为完整的 URL(使用您的 BASE 标记值)。这是预期的行为。
- 以前版本的选项卡 UI 会努力猜测 href 是否真的是远程的,拆分 href 选项卡值,然后将其与当前 URL和BASE 标记进行比较,然后确定它是否真的是本地的。
- 最新版本的 jQuery 不检查 BASE 标记值。
- 因此,最新版本与 BASE 元标记一起使用时,将尝试使用 Ajax 加载选项卡内容,重新加载自身(或 BASE URL 中的任何内容)。
这是 1.8.24 版本中使用的 jQuery UI 选项卡:
this.anchors.each(function( i, a ) {
var href = $( a ).attr( "href" );
// For dynamically created HTML that contains a hash as href IE < 8 expands
// such href to the full page url with hash and then misinterprets tab as ajax.
// Same consideration applies for an added tab with a fragment identifier
// since a[href=#fragment-identifier] does unexpectedly not match.
// Thus normalize href attribute...
var hrefBase = href.split( "#" )[ 0 ],
baseEl;
if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
href = a.hash;
a.href = href;
}
这是 jQuery UI Tabs 在 1.9.2 版本中使用的:
function isLocal( anchor ) {
return anchor.hash.length > 1 &&
anchor.href.replace( rhash, "" ) ===
location.href.replace( rhash, "" )
// support: Safari 5.1
// Safari 5.1 doesn't encode spaces in window.location
// but it does encode spaces from anchors (#8777)
.replace( /\s/g, "%20" );
}
由于 Tabs 代码的大量重写,代码的组织方式有所不同,但您可以理解($( "base" )[ 0 ]是 BASE 元标记值)。
到目前为止,我还没有找到任何方法来使用普通的选项卡 API 告诉选项卡“这是本地的,不要使用 Ajax”。我可以为您提供的是我在此期间为快速修复它所做的事情(当我询问、重新检查并可能填写错误报告时):一个 hack。
function isLocal( anchor ) {
return anchor.hash.length > 1 &&
( (anchor.href.replace( rhash, "" ) === location.href.replace( rhash, "" ).replace( /\s/g, "%20" )) ||
(anchor.href.replace( rhash, "" ) === $( "base" )[ 0 ].href));
}
这是较新的版本加上在以前版本中完成的检查。
在最新 jQuery UI 的非缩小副本中,用它替换 isLocal 函数。然后缩小文件。替换原来的版本。测试。
它在 Firefox (17.0.1) 和 Chromium (18.0.1025.168) 中对我有用。
缺点是您不能使用第三方副本(来自 CDN)。对我来说这不是问题,因为我的大多数应用程序都在 Intranet 中使用。
如果有人找到更好的解决方案或知道如何在不破解 jQuery UI 代码的情况下做到这一点,请告诉我们。
更新:我发现了这个错误报告(有几个重复):http ://bugs.jqueryui.com/ticket/7822 我很想添加我自己的评论,但似乎 jQuery 开发人员不会“修复”他们认为问题出在其他地方。来自 bugtracker 的引用:
我不明白这是如何修复的...
这是简单的动态 PHP 实现: 'http://' 。$_SERVER['HTTP_HOST'] 。$_SERVER['REQUEST_URI'] 。'#foo'。
在 JavaScript 中修复此问题也相当简单,但我不会提供示例代码,因为这是修复此问题的错误位置,应该强烈建议不要这样做。链接的行为在所有浏览器中都有明确的定义和一致的。绝对没有理由人们应该使用不正确的 URL,然后在 JavaScript 中绕过它们。
最后,重要的是要注意“修复”这将意味着破坏每个正确使用的人的正确行为。请记住,这是已修复的,因为具有正确 URL 的人遇到了旧代码中存在的真正错误。