WCAG Rule 16: H1 should match a subset of the words in the title element.

Rule Mapping

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