- From: David Dorward <david@dorward.me.uk>
- Date: Mon, 18 Dec 2006 22:01:01 +0000
- To: "Patrick H. Lauke" <redux@splintered.co.uk>, CSS validator list <www-validator-css@w3.org>
On Mon, Dec 18, 2006 at 06:53:38PM +0000, Patrick H. Lauke wrote:
> * There seems to be no way to get to the "More Options" pseudo-link via
> the keyboard
> * With javascript off, those "More Options" pseudo-links are still
> present, but useless.
I don't consider myself a JavaScript expert, but I've attacked the
code to see if I could produce something that addresses this
issue. I'm not 100% happy with the result (which, BTW, is tested only
in Firefox), but I think that its an improvement, and can be built
upon.
First - changes to the template:
Previously:
<fieldset id="extra_opt_uri" class="moreoptions">
<p class="toggle closed" title="Show/Hide extra validation options">More Options</p>
After my changes:
<fieldset id="extra_opt_uri" class="moreoptions alttoggle closed linkText_Show/Hide_extra_validation_options">
<legend>More Options</legend>
The paragraph has been removed (it gets added before the fieldset
using JavaScript in my suggested changes).
A legend has been added. The DTD doesn't require a legend for
fieldsets in XHTML 1.0, but:
* HTML 4.01 does
* The change isn't documented in the list of changes in the XHTML 1.0 spec
* I'm told the RELAX schema for XHTML 1.0 requires it
... so I think its absence is a bug in the spec.
And then the changed JavaScript:
// toggling event visibility
// v1.0 David Dorward for the W3C CSS Validation Service, 18/12/2006
// Based on v2.01 Kent Brewster, 6/8/2006 http://www.mindsack.com
// namespace protection: one global variable to rule them all
var W3C = {};
var W3C.QA = {};
var W3C.QA.Validator = {};
var W3C.QA.Validator.CSS = {};
W3C.QA.Validator.CSS.toggle =
{
init : function(toggle, closed, hidden)
{
// three class names, fed in from init call
this.toggleClass = toggle;
this.toggleClosed = closed;
this.toggleHidden = hidden;
// crawl through the document, look for toggled elements
this.crawl(document.body);
},
crawl : function(el)
{
// get this element's next sibling
var nextSib = this.getNextSibling(el);
// if it has a class name, the class name matches our toggle class
if (el.className && el.className.match(this.toggleClass))
{
// Generate an element
var paragraph = document.createElement('p');
var link = document.createElement('a');
var text = el.className.match(/linkText_(\S*)/)[1];
text = text.replace("_", " ", "g");
text = document.createTextNode(text);
link.appendChild(text);
link.href="#" + el.id;
link.onclick = this.newToggleState(this,paragraph,el);
paragraph.appendChild(link);
el.parentNode.insertBefore(paragraph, el);
// if the next sib ought to be hidden and it isn't already, hide it
// you can hard-code class=hidden in the HTML if you like, and avoid the Flash of Unstyled Content
if (el.className.match(this.toggleClosed))
{
el.className += ' ' + this.toggleHidden;
//el.parentNode.className += ' ' + this.toggleClosed;
}
}
// is there more to do? Do it, if so:
if (el.firstChild)
{
this.crawl(el.firstChild);
}
if (nextSib)
{
this.crawl(nextSib);
}
},
newToggleState : function(o,element,nextEl) {
return function () { return o.toggleState(element,nextEl) };
},
toggleState : function(el,nextEl)
{
// there's got to be a way to get this without stating it explicitly
var o = W3C.QA.Validator.CSS.toggle;
// change the style of the triggering element
if(el.className.match(o.toggleClosed))
{
el.className = el.className.replace(o.toggleClosed, '');
}
else
{
el.className = el.className + ' ' + o.toggleClosed;
}
// yes, we need to check if it's really there; other scripts could have removed it
if(nextEl && nextEl.className.match('hidden'))
{
nextEl.className = nextEl.className.replace(o.toggleHidden, '');
}
else
{
nextEl.className += ' ' + o.toggleHidden;
}
return false;
},
getNextSibling : function(el)
{
var nextSib = el.nextSibling;
// hack for Gecko browsers
if (nextSib && nextSib.nodeType != 1)
{
nextSib = nextSib.nextSibling;
}
return nextSib;
},
getEl : function(v)
{
var tg = (v) ? v : event;
var el = null;
if (tg.target)
{
el = (tg.target.nodeType == 3) ? tg.target.parentNode : tg.target;
}
else
{
el = tg.srcElement;
}
return el;
}
};
// feed it the CSS class names of your choice
window.onload = function()
{
W3C.QA.Validator.CSS.toggle.init('alttoggle', 'closed', 'hidden');
};
--
David Dorward http://dorward.me.uk
Received on Monday, 18 December 2006 22:01:09 UTC