mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/MultimediaViewer
synced 2024-11-26 00:55:43 +00:00
94476eb918
No longer needed as MediaWiki is no longer serving JavaScript to IE8 users. I noticed some possible candidates for removal in the less files as well but left those alone as this task seems specific to JavaScript. Bug: T123443 Change-Id: Ibf6d551798ff03a227b46dcb55bcf31899dad974
261 lines
10 KiB
JavaScript
261 lines
10 KiB
JavaScript
/*!
|
|
* jQuery hashchange event - v1.3 - 7/21/2010
|
|
* http://benalman.com/projects/jquery-hashchange-plugin/
|
|
*
|
|
* Copyright (c) 2010 "Cowboy" Ben Alman
|
|
* Dual licensed under the MIT and GPL licenses.
|
|
* http://benalman.com/about/license/
|
|
*/
|
|
|
|
// Forked on July 10th 2014 by Gilles Dubuc (WMF) in order to add jQuery 1.9 compatibility
|
|
// The fork was done because upstream is currently unmaintained and not responding to merge requests
|
|
|
|
// Script: jQuery hashchange event
|
|
//
|
|
// *Version: 1.3, Last updated: 7/21/2010*
|
|
//
|
|
// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
|
|
// GitHub - http://github.com/cowboy/jquery-hashchange/
|
|
// Source - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
|
|
// (Minified) - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
|
|
//
|
|
// About: License
|
|
//
|
|
// Copyright (c) 2010 "Cowboy" Ben Alman,
|
|
// Dual licensed under the MIT and GPL licenses.
|
|
// http://benalman.com/about/license/
|
|
//
|
|
// About: Examples
|
|
//
|
|
// These working examples, complete with fully commented code, illustrate a few
|
|
// ways in which this plugin can be used.
|
|
//
|
|
// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
|
|
// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
|
|
//
|
|
// About: Support and Testing
|
|
//
|
|
// Information about what version or versions of jQuery this plugin has been
|
|
// tested with, what browsers it has been tested in, and where the unit tests
|
|
// reside (so you can test it yourself).
|
|
//
|
|
// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
|
|
// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
|
|
// Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
|
|
// Unit Tests - http://benalman.com/code/projects/jquery-hashchange/unit/
|
|
//
|
|
// About: Known issues
|
|
//
|
|
// While this jQuery hashchange event implementation is quite stable and
|
|
// robust, there are a few unfortunate browser bugs surrounding expected
|
|
// hashchange event-based behaviors, independent of any JavaScript
|
|
// window.onhashchange abstraction. See the following examples for more
|
|
// information:
|
|
//
|
|
// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
|
|
// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
|
|
// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
|
|
// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
|
|
//
|
|
// Also note that should a browser natively support the window.onhashchange
|
|
// event, but not report that it does, the fallback polling loop will be used.
|
|
//
|
|
// About: Release History
|
|
//
|
|
// 1.3 - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
|
|
// "removable" for mobile-only development. Added IE6/7 document.title
|
|
// support. Attempted to make Iframe as hidden as possible by using
|
|
// techniques from http://www.paciellogroup.com/blog/?p=604. Added
|
|
// support for the "shortcut" format $(window).hashchange( fn ) and
|
|
// $(window).hashchange() like jQuery provides for built-in events.
|
|
// Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
|
|
// lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
|
|
// and <jQuery.fn.hashchange.src> properties plus document-domain.html
|
|
// file to address access denied issues when setting document.domain in
|
|
// IE6/7.
|
|
// 1.2 - (2/11/2010) Fixed a bug where coming back to a page using this plugin
|
|
// from a page on another domain would cause an error in Safari 4. Also,
|
|
// IE6/7 Iframe is now inserted after the body (this actually works),
|
|
// which prevents the page from scrolling when the event is first bound.
|
|
// Event can also now be bound before DOM ready, but it won't be usable
|
|
// before then in IE6/7.
|
|
// 1.1 - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
|
|
// where browser version is incorrectly reported as 8.0, despite
|
|
// inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
|
|
// 1.0 - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
|
|
// window.onhashchange functionality into a separate plugin for users
|
|
// who want just the basic event & back button support, without all the
|
|
// extra awesomeness that BBQ provides. This plugin will be included as
|
|
// part of jQuery BBQ, but also be available separately.
|
|
|
|
(function($,window,undefined){
|
|
'$:nomunge'; // Used by YUI compressor.
|
|
|
|
// Reused string.
|
|
var str_hashchange = 'hashchange',
|
|
|
|
// Method / object references.
|
|
doc = document,
|
|
fake_onhashchange,
|
|
special = $.event.special,
|
|
|
|
// Does the browser support window.onhashchange?
|
|
supports_onhashchange = 'on' + str_hashchange in window;
|
|
|
|
// Get location.hash (or what you'd expect location.hash to be) sans any
|
|
// leading #. Thanks for making this necessary, Firefox!
|
|
function get_fragment( url ) {
|
|
url = url || location.href;
|
|
return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
|
|
};
|
|
|
|
// Method: jQuery.fn.hashchange
|
|
//
|
|
// Bind a handler to the window.onhashchange event or trigger all bound
|
|
// window.onhashchange event handlers. This behavior is consistent with
|
|
// jQuery's built-in event handlers.
|
|
//
|
|
// Usage:
|
|
//
|
|
// > jQuery(window).hashchange( [ handler ] );
|
|
//
|
|
// Arguments:
|
|
//
|
|
// handler - (Function) Optional handler to be bound to the hashchange
|
|
// event. This is a "shortcut" for the more verbose form:
|
|
// jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
|
|
// all bound window.onhashchange event handlers will be triggered. This
|
|
// is a shortcut for the more verbose
|
|
// jQuery(window).trigger( 'hashchange' ). These forms are described in
|
|
// the <hashchange event> section.
|
|
//
|
|
// Returns:
|
|
//
|
|
// (jQuery) The initial jQuery collection of elements.
|
|
|
|
// Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
|
|
// $(elem).hashchange() for triggering, like jQuery does for built-in events.
|
|
$.fn[ str_hashchange ] = function( fn ) {
|
|
return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
|
|
};
|
|
|
|
// Property: jQuery.fn.hashchange.delay
|
|
//
|
|
// The numeric interval (in milliseconds) at which the <hashchange event>
|
|
// polling loop executes. Defaults to 50.
|
|
|
|
$.fn[ str_hashchange ].delay = 50;
|
|
|
|
// Event: hashchange event
|
|
//
|
|
// Fired when location.hash changes. In browsers that support it, the native
|
|
// HTML5 window.onhashchange event is used, otherwise a polling loop is
|
|
// initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
|
|
// see if the hash has changed.
|
|
//
|
|
// Usage as described in <jQuery.fn.hashchange>:
|
|
//
|
|
// > // Bind an event handler.
|
|
// > jQuery(window).hashchange( function(e) {
|
|
// > var hash = location.hash;
|
|
// > ...
|
|
// > });
|
|
// >
|
|
// > // Manually trigger the event handler.
|
|
// > jQuery(window).hashchange();
|
|
//
|
|
// A more verbose usage that allows for event namespacing:
|
|
//
|
|
// > // Bind an event handler.
|
|
// > jQuery(window).bind( 'hashchange', function(e) {
|
|
// > var hash = location.hash;
|
|
// > ...
|
|
// > });
|
|
// >
|
|
// > // Manually trigger the event handler.
|
|
// > jQuery(window).trigger( 'hashchange' );
|
|
//
|
|
// Additional Notes:
|
|
//
|
|
// * The polling loop and Iframe are not created until at least one handler
|
|
// is actually bound to the 'hashchange' event.
|
|
// * If you need the bound handler(s) to execute immediately, in cases where
|
|
// a location.hash exists on page load, via bookmark or page refresh for
|
|
// example, use jQuery(window).hashchange() or the more verbose
|
|
// jQuery(window).trigger( 'hashchange' ).
|
|
|
|
// Override existing $.event.special.hashchange methods (allowing this plugin
|
|
// to be defined after jQuery BBQ in BBQ's source code).
|
|
special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
|
|
|
|
// Called only when the first 'hashchange' event is bound to window.
|
|
setup: function() {
|
|
// If window.onhashchange is supported natively, there's nothing to do..
|
|
if ( supports_onhashchange ) { return false; }
|
|
|
|
// Otherwise, we need to create our own. And we don't want to call this
|
|
// until the user binds to the event, just in case they never do, since it
|
|
// will create a polling loop and possibly even a hidden Iframe.
|
|
$( fake_onhashchange.start );
|
|
},
|
|
|
|
// Called only when the last 'hashchange' event is unbound from window.
|
|
teardown: function() {
|
|
// If window.onhashchange is supported natively, there's nothing to do..
|
|
if ( supports_onhashchange ) { return false; }
|
|
|
|
// Otherwise, we need to stop ours (if possible).
|
|
$( fake_onhashchange.stop );
|
|
}
|
|
|
|
});
|
|
|
|
// fake_onhashchange creates a polling loop to watch for hash changes and
|
|
// triggers the window.onhashchange event for browsers that don't natively
|
|
// support it.
|
|
fake_onhashchange = (function(){
|
|
var self = {},
|
|
timeout_id,
|
|
|
|
// Remember the initial hash so it doesn't get triggered immediately.
|
|
last_hash = get_fragment(),
|
|
|
|
fn_retval = function(val){ return val; },
|
|
history_set = fn_retval,
|
|
history_get = fn_retval;
|
|
|
|
// Start the polling loop.
|
|
self.start = function() {
|
|
timeout_id || poll();
|
|
};
|
|
|
|
// Stop the polling loop.
|
|
self.stop = function() {
|
|
timeout_id && clearTimeout( timeout_id );
|
|
timeout_id = undefined;
|
|
};
|
|
|
|
// This polling loop checks every $.fn.hashchange.delay milliseconds to see
|
|
// if location.hash has changed, and triggers the 'hashchange' event on
|
|
// window when necessary.
|
|
function poll() {
|
|
var hash = get_fragment(),
|
|
history_hash = history_get( last_hash );
|
|
|
|
if ( hash !== last_hash ) {
|
|
history_set( last_hash = hash, history_hash );
|
|
|
|
$(window).trigger( str_hashchange );
|
|
|
|
} else if ( history_hash !== last_hash ) {
|
|
location.href = location.href.replace( /#.*/, '' ) + history_hash;
|
|
}
|
|
|
|
timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
|
|
};
|
|
|
|
return self;
|
|
})();
|
|
|
|
})(jQuery,this);
|