264 lines
7.4 KiB
HTML
264 lines
7.4 KiB
HTML
<html>
|
|
<head>
|
|
<title>Tabbed UI</title>
|
|
<style type="text/css">
|
|
.tab {
|
|
color: navy;
|
|
background-color: lightgrey;
|
|
border: thin solid navy;
|
|
text-align: center;
|
|
font: 9pt Verdana,sans-serif;
|
|
padding: 4px;
|
|
padding-left: 2em;
|
|
padding-right: 2em;
|
|
}
|
|
|
|
.tabActive {
|
|
color:black;
|
|
font-weight:bold;
|
|
border:thin dashed black;
|
|
background-color: beige;
|
|
border-bottom: thin solid beige;
|
|
border-left: thin solid navy;
|
|
border-top: thin solid navy;
|
|
border-right: thin solid navy;
|
|
}
|
|
|
|
div[aria-hidden="true"] { display: none; }
|
|
|
|
.panel {
|
|
position: relative;
|
|
top: 3px;
|
|
background-color: beige;
|
|
color: navy;
|
|
width: 95%;
|
|
height: 85%;
|
|
font: 12pt Verdana,sans-serif;
|
|
border: thin solid navy;
|
|
padding: 10px;
|
|
overflow: auto;
|
|
}
|
|
|
|
</style>
|
|
|
|
<script>
|
|
<!--
|
|
// global to store the item to be focused
|
|
gFocusItem = null;
|
|
|
|
function doFocus()
|
|
{
|
|
if (gFocusItem != null) {
|
|
gFocusItem.focus();
|
|
gFocusItem=null;
|
|
}
|
|
}
|
|
|
|
var KEY_UP = 38;
|
|
var KEY_DOWN = 40;
|
|
var KEY_LEFT = 37;
|
|
var KEY_RIGHT = 39;
|
|
var KEY_ESCAPE = 27;
|
|
var KEY_M = 77;
|
|
var KEY_F10 = 121;
|
|
var KEY_SPACE = 32;
|
|
var KEY_TAB = 9;
|
|
var KEY_PAGEUP = 33;
|
|
var KEY_PAGEDOWN = 34;
|
|
|
|
// globals to store current tab information
|
|
var gCurrentTabNum = -1;
|
|
var gNumTabs = 5;
|
|
|
|
function selectTab(nextTabNum)
|
|
{
|
|
var newTab = document.getElementById("tab" + nextTabNum);
|
|
gFocusItem = newTab;
|
|
setTimeout("doFocus()", 0);
|
|
}
|
|
|
|
function doNavigation(event)
|
|
{
|
|
var key = event.keyCode; //alert(key);
|
|
var bEventContinue = true;
|
|
var nextTabNum;
|
|
var bDoNextTab = true; // requires less code if init to true
|
|
var bCtrlKey = event.ctrlKey;
|
|
var bAltKey = event.altKey;
|
|
var direction = 0;
|
|
var bCycle = false;
|
|
if ((key == KEY_LEFT || key == KEY_RIGHT) && !bAltKey) {
|
|
bCycle = false;
|
|
bEventContinue = false;
|
|
if (key == KEY_RIGHT) {
|
|
direction = 1;
|
|
}
|
|
else if (key == KEY_LEFT) {
|
|
direction = -1;
|
|
}
|
|
}
|
|
else if (bCtrlKey && event.shiftKey) {
|
|
bCycle = true; //ctrl-shift-pageup, ctrl-shift-pagedown,
|
|
switch (key) {
|
|
case KEY_PAGEUP:
|
|
direction = -1;
|
|
break;
|
|
case KEY_PAGEDOWN:
|
|
direction = 1;
|
|
break;
|
|
default:
|
|
bDoNextTab = false;
|
|
break;
|
|
} // end switch
|
|
} // end of if ctrlKey and shiftKey
|
|
else {
|
|
// not a key we care about
|
|
bDoNextTab = false;
|
|
}
|
|
|
|
if (bDoNextTab == true) {
|
|
if (direction > 0) {
|
|
nextTabNum = gCurrentTabNum + 1;
|
|
}
|
|
else if (direction < 0) {
|
|
nextTabNum = gCurrentTabNum -1;
|
|
}
|
|
if (nextTabNum == gNumTabs && bCycle == true) {
|
|
nextTabNum = 0;
|
|
}
|
|
else if (nextTabNum < 0 && bCycle == true) {
|
|
nextTabNum = gNumTabs -1;
|
|
}
|
|
else if ((nextTabNum == gNumTabs || nextTabNum < 0) && bCycle == false) {
|
|
bDoNextTab = false; // do nothing
|
|
}
|
|
// test again - last section may have changed value of bDoNextTab
|
|
if (bDoNextTab == true) {
|
|
selectTab(nextTabNum);
|
|
}
|
|
}
|
|
|
|
return bEventContinue;
|
|
}
|
|
|
|
function handleFocus(event)
|
|
{
|
|
var newTab = event.target;
|
|
if (newTab.getAttribute("role") != "tab")
|
|
return;
|
|
|
|
newTabNum = parseInt(newTab.id.charAt(3));
|
|
if (newTabNum == gCurrentTabNum)
|
|
return;
|
|
|
|
if (gCurrentTabNum >= 0) {
|
|
var curTab = document.getElementById("tab" + gCurrentTabNum);
|
|
var curPanel = document.getElementById("panel" + gCurrentTabNum);
|
|
curPanel.setAttribute("aria-hidden", "true");
|
|
curPanel.className += ""; // Force refresh of attribute selectors
|
|
curTab.setAttribute("class", "tab");
|
|
curTab.tabIndex = "-1";
|
|
}
|
|
|
|
var newTab = document.getElementById("tab" + newTabNum);
|
|
var newPanel = document.getElementById("panel" + newTabNum);
|
|
newPanel.removeAttribute("aria-hidden");
|
|
newPanel.className += ""; // Force refresh of attribute selectors
|
|
newTab.setAttribute("class", "tab tabActive");
|
|
newTab.tabIndex = "0";
|
|
|
|
gCurrentTabNum = newTabNum;
|
|
}
|
|
|
|
-->
|
|
</script>
|
|
<style type="text/css"></style></head>
|
|
<body onload="selectTab(0);">
|
|
<div role="tablist" onkeydown="return doNavigation(event);">
|
|
<span id="tab0" tabindex="0" class="tab tabActive" role="tab" onclick="selectTab(0);" onfocus="handleFocus(event);">
|
|
Tab Zero
|
|
</span>
|
|
<span id="tab1" tabindex="-1" class="tab" role="tab" onclick="selectTab(1);" onfocus="handleFocus(event);">
|
|
Tab One
|
|
</span>
|
|
<span id="tab2" tabindex="-1" class="tab" role="tab" onclick="selectTab(2);" onfocus="handleFocus(event);">
|
|
Tab Two
|
|
</span>
|
|
<span id="tab3" tabindex="-1" class="tab" role="tab" onclick="selectTab(3);" onfocus="handleFocus(event);">
|
|
Tab Three
|
|
</span>
|
|
<span id="tab4" tabindex="-1" class="tab" role="tab" onclick="selectTab(4);" onfocus="handleFocus(event);">
|
|
Tab Four
|
|
</span>
|
|
</div>
|
|
|
|
<div id="tabpanels" role="presentation">
|
|
<div id="panel0" class="panel" tabindex="-1" role="tabpanel" aria-labelledby="tab0">
|
|
<span>Panel 0</span>
|
|
<p>This example requires Firefox 3 or later to work with screen readers -- it
|
|
uses ARIA properties without namespaces, which is now the correct
|
|
markup.</p>
|
|
<div>Use tab key to reach the tab. Once a tab has focus use:
|
|
<ul>
|
|
<li>left and right arrows to move from tab to tab. Panel is made visible when
|
|
tab gets focus. Arrow keys do not cycle around the tabs</li>
|
|
<li>ctrl-left and ctrl-right arrows behave the same as left and right arrows</li>
|
|
<li>ctrl-shift-pageup / ctrl-shift-pagedown is the same as left and right arrows but WILL
|
|
cycle around the tab order (shift was added as a modifier so as not to
|
|
conflict with the Firefox tabbing keys)</li>
|
|
<li>Ctrl-shift-tab /ctrl-tab are not implemented since these keys conflict with browser tab switching keys.</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="panel1" class="panel" tabindex="-1" role="tabpanel" aria-hidden="true" aria-labelledby="tab1">
|
|
<span>Panel 1</span>
|
|
<div>Some fields on the panel </div>
|
|
<div>
|
|
<p>Enter month and year: <label for="month">Select Month</label>
|
|
<select id="month">
|
|
<option value="1">01</option>
|
|
<option value="2">02</option>
|
|
<option value="3">03</option>
|
|
<option value="4">04</option>
|
|
<option value="5">05</option>
|
|
<option value="6">06</option>
|
|
<option value="7">07</option>
|
|
<option value="8">08</option>
|
|
<option value="9">09</option>
|
|
<option value="10">10</option>
|
|
<option value="11">11</option>
|
|
<option value="12">12</option>
|
|
</select>
|
|
<label for="year">Select Year</label>
|
|
<select id="year">
|
|
<option value="2004">2004</option>
|
|
<option value="2005">2005</option>
|
|
<option value="2006">2006</option>
|
|
</select>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="panel2" class="panel" role="tabpanel" aria-hidden="true" aria-labelledby="tab2">
|
|
<span>Panel 2</span>
|
|
<div>Some fields on the panel</div>
|
|
<div>
|
|
<input id="internal" name="urlType" value="internal" checked="true" type="radio"><label for="internal">Internal Portal Bookmark</label>
|
|
<input id="external" name="urlType" value="external" type="radio"><label for="external">External URL</label>
|
|
<br><label for="externalAssoc">URL: </label><input id="externalAssoc" value="" type="text">
|
|
<hr>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="panel3" class="panel" role="tabpanel" aria-hidden="true" aria-labelledby="tab3">
|
|
<span>Panel 3</span>
|
|
</div>
|
|
|
|
<div id="panel4" class="panel" role="tabpanel" aria-hidden="true" aria-labelledby="tab4">
|
|
<span>Panel 4</span>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|