Skip to content
Snippets Groups Projects
Commit 00540a38 authored by Andreas Gohr's avatar Andreas Gohr
Browse files

unobstrusive JS for TOC, better onload handling

This path adds more unobstrusive JavaScript for the TOC handling. It also
loads JavaScript initialiezers as soon as the DOM is parsed for Mozilla-based
Browsers as described at http://dean.edwards.name/weblog/2005/09/busted/ - a
IE solution was not chosen yet.

darcs-hash:20051210193709-7ad00-771461e56d9661caf9ca733a6d617f009e24d0b7.gz
parent 0a6ead41
No related branches found
No related tags found
No related merge requests found
...@@ -86,11 +86,10 @@ class Doku_Renderer_xhtml extends Doku_Renderer { ...@@ -86,11 +86,10 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
function toc_open() { function toc_open() {
global $lang; global $lang;
$this->doc .= '<div class="toc">'.DOKU_LF; $this->doc .= '<div class="toc">'.DOKU_LF;
$this->doc .= '<div class="tocheader">'; $this->doc .= '<div class="tocheader" id="toc__header">';
$this->doc .= ' <script type="text/javascript">showTocToggle("+","-")</script>';
$this->doc .= $lang['toc']; $this->doc .= $lang['toc'];
$this->doc .= '</div>'.DOKU_LF; $this->doc .= '</div>'.DOKU_LF;
$this->doc .= '<div id="tocinside">'.DOKU_LF; $this->doc .= '<div id="toc__inside">'.DOKU_LF;
} }
function tocbranch_open($level) { function tocbranch_open($level) {
......
...@@ -77,6 +77,7 @@ function js_out(){ ...@@ -77,6 +77,7 @@ function js_out(){
// init stuff // init stuff
js_runonstart("ajax_qsearch.init('qsearch_in','qsearch_out')"); js_runonstart("ajax_qsearch.init('qsearch_in','qsearch_out')");
js_runonstart("addEvent(document,'click',closePopups)"); js_runonstart("addEvent(document,'click',closePopups)");
js_runonstart('addTocToggle()');
if($edit){ if($edit){
// size controls // size controls
...@@ -114,6 +115,13 @@ function js_out(){ ...@@ -114,6 +115,13 @@ function js_out(){
// load user script // load user script
@readfile(DOKU_CONF.'userscript.js'); @readfile(DOKU_CONF.'userscript.js');
// initialize init pseudo event
echo 'if (document.addEventListener) {';
echo ' document.addEventListener("DOMContentLoaded", window.fireoninit, null);';
echo '}';
echo 'addEvent(window,"load",window.fireoninit);';
// end output buffering and get contents // end output buffering and get contents
$js = ob_get_contents(); $js = ob_get_contents();
ob_end_clean(); ob_end_clean();
...@@ -184,7 +192,7 @@ function js_escape($string){ ...@@ -184,7 +192,7 @@ function js_escape($string){
* @author Andreas Gohr <andi@splitbrain.org> * @author Andreas Gohr <andi@splitbrain.org>
*/ */
function js_runonstart($func){ function js_runonstart($func){
print "addEvent(window,'load',function(){ $func; });"; echo "addInitEvent(function(){ $func; });";
} }
/** /**
......
...@@ -59,4 +59,54 @@ fixEvent.preventDefault = function() { ...@@ -59,4 +59,54 @@ fixEvent.preventDefault = function() {
}; };
fixEvent.stopPropagation = function() { fixEvent.stopPropagation = function() {
this.cancelBubble = true; this.cancelBubble = true;
}; };
\ No newline at end of file
/**
* Pseudo event handler to be fired after the DOM was parsed or
* on window load at last.
*
* @author based upon some code by Dean Edwards
* @author Andreas Gohr
* @see http://dean.edwards.name/weblog/2005/09/busted/
*/
window.fireoninit = function() {
// quit if this function has already been called
if (arguments.callee.done) return;
// flag this function so we don't do the same thing twice
arguments.callee.done = true;
if (typeof window.oninit == 'function') {
window.oninit();
}
}
/**
* This is a pseudo Event that will be fired by the above function
*
* Use addInitEvent to bind to this event!
*
* @author Andreas Gohr
*/
window.oninit = function() {
}
/**
* Bind a function to the window.init pseudo event
*
* @author Simon Willison
* @see http://simon.incutio.com/archive/2004/05/26/addLoadEvent
*/
function addInitEvent(func) {
var oldoninit = window.oninit;
if (typeof window.oninit != 'function') {
window.oninit = func;
} else {
window.oninit = function() {
oldoninit();
func();
};
}
}
...@@ -97,6 +97,19 @@ function escapeQuotes(text) { ...@@ -97,6 +97,19 @@ function escapeQuotes(text) {
return text; return text;
} }
/**
* Adds a node as the first childenode to the given parent
*
* @see appendChild()
*/
function prependChild(parent,element) {
if(!parent.firstChild){
parent.appendChild(element);
}else{
parent.insertBefore(element,parent.firstChild);
}
}
/** /**
* Prints a animated gif to show the search is performed * Prints a animated gif to show the search is performed
* *
...@@ -143,37 +156,45 @@ function suggestWikiname(){ ...@@ -143,37 +156,45 @@ function suggestWikiname(){
} }
/** /**
* This prints the switch to toggle the Table of Contents * Adds the toggle switch to the TOC
*/ */
function showTocToggle(showtxt,hidetxt) { function addTocToggle() {
if(document.getElementById) { if(!document.getElementById) return;
show = '<img src="'+DOKU_BASE+'lib/images/arrow_down.gif" alt="'+showtxt+'">'; var header = document.getElementById('toc__header');
hide = '<img src="'+DOKU_BASE+'lib/images/arrow_up.gif" alt="'+hidetxt+'">'; if(!header) return;
document.writeln('<div class=\'toctoggle\'><a href="javascript:toggleToc()" class="toc">' + var showimg = document.createElement('img');
'<span id="showlink" style="display:none;">' + show + '</span>' + showimg.id = 'toc__show';
'<span id="hidelink">' + hide + '</span>' + showimg.src = DOKU_BASE+'lib/images/arrow_down.gif';
'</a></div>'); showimg.alt = '+';
} showimg.onclick = toggleToc;
showimg.style.display = 'none';
var hideimg = document.createElement('img');
hideimg.id = 'toc__hide';
hideimg.src = DOKU_BASE+'lib/images/arrow_up.gif';
hideimg.alt = '-';
hideimg.onclick = toggleToc;
prependChild(header,showimg);
prependChild(header,hideimg);
} }
/** /**
* This toggles the visibility of the Table of Contents * This toggles the visibility of the Table of Contents
*/ */
function toggleToc() { function toggleToc() {
var toc = document.getElementById('tocinside'); var toc = document.getElementById('toc__inside');
var showlink=document.getElementById('showlink'); var showimg = document.getElementById('toc__show');
var hidelink=document.getElementById('hidelink'); var hideimg = document.getElementById('toc__hide');
if(toc.style.display == 'none') { if(toc.style.display == 'none') {
toc.style.display = tocWas; toc.style.display = '';
hidelink.style.display=''; hideimg.style.display = '';
showlink.style.display='none'; showimg.style.display = 'none';
} else { } else {
tocWas = toc.style.display; toc.style.display = 'none';
toc.style.display = 'none'; hideimg.style.display = 'none';
hidelink.style.display='none'; showimg.style.display = '';
showlink.style.display='';
} }
} }
......
...@@ -482,17 +482,18 @@ div.tocheader { ...@@ -482,17 +482,18 @@ div.tocheader {
} }
div.toctoggle { div.toctoggle {
float:right;
margin-top:0.3em;
margin-right:3px;
} }
div.toctoggle img { div.tocheader img {
width:0.8em; width:0.8em;
height:0.8em; height:0.8em;
float:right;
margin-top:0.3em;
margin-right:3px;
cursor: pointer;
} }
#tocinside { #toc__inside {
border: 1px solid __dark__; border: 1px solid __dark__;
background-color: __white__; background-color: __white__;
text-align: left; text-align: left;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment