Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Futon history browsing - applied patch from COUCHDB-186
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@732413 13f79535-47bb-0310-9956-ffa450edef68
- Loading branch information
Showing
5 changed files
with
177 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
/* | ||
* jQuery history plugin | ||
* | ||
* Copyright (c) 2006 Taku Sano (Mikage Sawatari) | ||
* Licensed under the MIT License: | ||
* http://www.opensource.org/licenses/mit-license.php | ||
* | ||
* Modified by Lincoln Cooper to add Safari support and only call the callback once during initialization | ||
* for msie when no initial hash supplied. | ||
*/ | ||
|
||
|
||
jQuery.extend({ | ||
historyCurrentHash: undefined, | ||
|
||
historyCallback: undefined, | ||
|
||
historyInit: function(callback){ | ||
jQuery.historyCallback = callback; | ||
var current_hash = location.hash; | ||
|
||
jQuery.historyCurrentHash = current_hash; | ||
if(jQuery.browser.msie) { | ||
// To stop the callback firing twice during initilization if no hash present | ||
if (jQuery.historyCurrentHash == '') { | ||
jQuery.historyCurrentHash = '#'; | ||
} | ||
|
||
// add hidden iframe for IE | ||
$("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>'); | ||
var ihistory = $("#jQuery_history")[0]; | ||
var iframe = ihistory.contentWindow.document; | ||
iframe.open(); | ||
iframe.close(); | ||
iframe.location.hash = current_hash; | ||
} | ||
else if ($.browser.safari) { | ||
// etablish back/forward stacks | ||
jQuery.historyBackStack = []; | ||
jQuery.historyBackStack.length = history.length; | ||
jQuery.historyForwardStack = []; | ||
|
||
jQuery.isFirst = true; | ||
} | ||
jQuery.historyCallback(current_hash.replace(/^#/, '')); | ||
setInterval(jQuery.historyCheck, 100); | ||
}, | ||
|
||
historyAddHistory: function(hash) { | ||
// This makes the looping function do something | ||
jQuery.historyBackStack.push(hash); | ||
|
||
jQuery.historyForwardStack.length = 0; // clear forwardStack (true click occured) | ||
this.isFirst = true; | ||
}, | ||
|
||
historyCheck: function(){ | ||
if(jQuery.browser.msie) { | ||
// On IE, check for location.hash of iframe | ||
var ihistory = $("#jQuery_history")[0]; | ||
var iframe = ihistory.contentDocument || ihistory.contentWindow.document; | ||
var current_hash = iframe.location.hash; | ||
if(current_hash != jQuery.historyCurrentHash) { | ||
|
||
location.hash = current_hash; | ||
jQuery.historyCurrentHash = current_hash; | ||
jQuery.historyCallback(current_hash.replace(/^#/, '')); | ||
|
||
} | ||
} else if ($.browser.safari) { | ||
if (!jQuery.dontCheck) { | ||
var historyDelta = history.length - jQuery.historyBackStack.length; | ||
|
||
if (historyDelta) { // back or forward button has been pushed | ||
jQuery.isFirst = false; | ||
if (historyDelta < 0) { // back button has been pushed | ||
// move items to forward stack | ||
for (var i = 0; i < Math.abs(historyDelta); i++) jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop()); | ||
} else { // forward button has been pushed | ||
// move items to back stack | ||
for (var i = 0; i < historyDelta; i++) jQuery.historyBackStack.push(jQuery.historyForwardStack.shift()); | ||
} | ||
var cachedHash = jQuery.historyBackStack[jQuery.historyBackStack.length - 1]; | ||
if (cachedHash != undefined) { | ||
jQuery.historyCurrentHash = location.hash; | ||
jQuery.historyCallback(cachedHash); | ||
} | ||
} else if (jQuery.historyBackStack[jQuery.historyBackStack.length - 1] == undefined && !jQuery.isFirst) { | ||
// back button has been pushed to beginning and URL already pointed to hash (e.g. a bookmark) | ||
// document.URL doesn't change in Safari | ||
if (document.URL.indexOf('#') >= 0) { | ||
jQuery.historyCallback(document.URL.split('#')[1]); | ||
} else { | ||
var current_hash = location.hash; | ||
jQuery.historyCallback(''); | ||
} | ||
jQuery.isFirst = true; | ||
} | ||
} | ||
} else { | ||
// otherwise, check for location.hash | ||
var current_hash = location.hash; | ||
if(current_hash != jQuery.historyCurrentHash) { | ||
jQuery.historyCurrentHash = current_hash; | ||
jQuery.historyCallback(current_hash.replace(/^#/, '')); | ||
} | ||
} | ||
}, | ||
historyLoad: function(hash){ | ||
var newhash; | ||
|
||
if (jQuery.browser.safari) { | ||
newhash = hash; | ||
} | ||
else { | ||
newhash = '#' + hash; | ||
location.hash = newhash; | ||
} | ||
jQuery.historyCurrentHash = newhash; | ||
|
||
if(jQuery.browser.msie) { | ||
var ihistory = $("#jQuery_history")[0]; | ||
var iframe = ihistory.contentWindow.document; | ||
iframe.open(); | ||
iframe.close(); | ||
iframe.location.hash = newhash; | ||
jQuery.historyCallback(hash); | ||
} | ||
else if (jQuery.browser.safari) { | ||
jQuery.dontCheck = true; | ||
// Manually keep track of the history values for Safari | ||
this.historyAddHistory(hash); | ||
|
||
// Wait a while before allowing checking so that Safari has time to update the "history" object | ||
// correctly (otherwise the check loop would detect a false change in hash). | ||
var fn = function() {jQuery.dontCheck = false;}; | ||
window.setTimeout(fn, 200); | ||
jQuery.historyCallback(hash); | ||
// N.B. "location.hash=" must be the last line of code for Safari as execution stops afterwards. | ||
// By explicitly using the "location.hash" command (instead of using a variable set to "location.hash") the | ||
// URL in the browser and the "history" object are both updated correctly. | ||
location.hash = newhash; | ||
} | ||
else { | ||
jQuery.historyCallback(hash); | ||
} | ||
} | ||
}); | ||
|
||
|