Drucken | Schließen

Wer jQueryUI in der Version 1.9.2 und einem base-Tag auf einer Webseite verwendet, der hatte das Phänomen, das sich die komplette Seite unenedlich per AJAX in den offenen Tab lädt.

Bis zur Version 1.8 wurde der href von den Tab-Links mit dem base-href verglichen und gerraten, ob es sich um eine lokale URL handelt oder nicht.

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;
      }

Ab Version 1.9 wurde folgende Änderung vorgenommen:

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));
}


Es fehlt die Abfrage vom base-Tag. Ein Hack könnte so aussehen, das eine weitere ODER-Verknüpfung hinzu kommt (fett dargestellt)

Eine weitere JavaScript-Lösung könnte sein:

// get the <base> Tag and remove it BEFORE initializing jQueryUI Tabs
var $base = $('base');
$base.remove();
// all tab-containers
var $tabs = $('.tabs');
// fix the href attribute
$tabs.find('> ul > li > a').each(function() {
var $this = $(this),
href = $this.attr('href'),
hash = href.split('#'),
last = hash[hash.length - 1];
if (last) {
newHash = window.location.protocol +'//'+ window.location.host + window.location.pathname + window.location.search +'#'+ hash[1];
$this.attr('href', newHash);
}
});
// initiate jQueryUI Tabs
$tabs.tabs();
// append the <base> Tag again
$('head').prepend($base);