WCAG Rule 16: H1 should match a subset of the words in the title element.
Rule Mapping
- Status: Accepted
- Severity: Recommendation
- Priority: Priority 1
Markup References
Validation Code
Dependencies
None
Context
document
Parameters
None
Code
function (ruleContext) {
var retNodeArr = new Array();
var titleMissingH1WordsText = '';
var missingWordArray = new Array();
var titleNode = ruleContext.getElementsByTagName("title")[0];
var titleText = xbrowser.getTextContent(titleNode).replace(/^\s*|\s*$/g,"").replace(/\s+/g,' ');
var tmp = titleText.replace(/[^a-zA-Z0-9]\s+/g, ' ');
var titleWordsArray = tmp.toLowerCase().split(' ');
var h1Arr = ruleContext.getElementsByTagName("h1");
for (var i=0; i<h1Arr.length; i++) {
var h1Node = h1Arr[i];
var h1Text = util.getNodeTextRecursively(h1Node);
tmp = h1Text.replace(/[^a-zA-Z0-9]\s+/g, ' ');
var h1WordsArray = tmp.toLowerCase().split(' ');
for(var h1Index =0, titleMissingH1Words = false; h1Index < h1WordsArray.length; h1Index++) {
for(var titleIndex=0, found = false; titleIndex < titleWordsArray.length && !found; titleIndex++) {
found = h1WordsArray[h1Index] == titleWordsArray[titleIndex];
} //end for
if (!found) {
titleMissingH1Words = true;
var k=0;
while(k < missingWordArray.length && h1WordsArray[h1Index] != missingWordArray[k]) {
k++;
} //end while
if (k >= missingWordArray.length) {
missingWordArray[missingWordArray.length] = h1WordsArray[h1Index];
} //endif
} //endif
} //end for
if (titleMissingH1Words) retNodeArr.push(h1Node);
} //endfor
if (retNodeArr.length > 0) retNodeArr.push(titleNode);
if (missingWordArray.length > 0) {
titleMissingH1WordsText = missingWordArray.join(" ");
} //endif
var passed = !titleMissingH1Words;
return new ValidationResult(passed, retNodeArr, '', '', [titleMissingH1WordsText]);
} // endif
>
var retNodeArr = new Array();
var titleMissingH1WordsText = '';
var missingWordArray = new Array();
var titleNode = ruleContext.getElementsByTagName("title")[0];
var titleText = xbrowser.getTextContent(titleNode).replace(/^\s*|\s*$/g,"").replace(/\s+/g,' ');
var tmp = titleText.replace(/[^a-zA-Z0-9]\s+/g, ' ');
var titleWordsArray = tmp.toLowerCase().split(' ');
var h1Arr = ruleContext.getElementsByTagName("h1");
for (var i=0; i<h1Arr.length; i++) {
var h1Node = h1Arr[i];
var h1Text = util.getNodeTextRecursively(h1Node);
tmp = h1Text.replace(/[^a-zA-Z0-9]\s+/g, ' ');
var h1WordsArray = tmp.toLowerCase().split(' ');
for(var h1Index =0, titleMissingH1Words = false; h1Index < h1WordsArray.length; h1Index++) {
for(var titleIndex=0, found = false; titleIndex < titleWordsArray.length && !found; titleIndex++) {
found = h1WordsArray[h1Index] == titleWordsArray[titleIndex];
} //end for
if (!found) {
titleMissingH1Words = true;
var k=0;
while(k < missingWordArray.length && h1WordsArray[h1Index] != missingWordArray[k]) {
k++;
} //end while
if (k >= missingWordArray.length) {
missingWordArray[missingWordArray.length] = h1WordsArray[h1Index];
} //endif
} //endif
} //end for
if (titleMissingH1Words) retNodeArr.push(h1Node);
} //endfor
if (retNodeArr.length > 0) retNodeArr.push(titleNode);
if (missingWordArray.length > 0) {
titleMissingH1WordsText = missingWordArray.join(" ");
} //endif
var passed = !titleMissingH1Words;
return new ValidationResult(passed, retNodeArr, '', '', [titleMissingH1WordsText]);
} // endif
>