code: function( elem, context, xml ) {
  			var data, cache, outerCache,
  				dirkey = dirruns + " " + doneName;
  
  			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
  			if ( xml ) {
  				while ( (elem = elem[ dir ]) ) {
  					if ( elem.nodeType === 1 || checkNonElements ) {
  						if ( matcher( elem, context, xml ) ) {
  							return true;
  						}
  					}
  				}
  			} else {
  				while ( (elem = elem[ dir ]) ) {
  					if ( elem.nodeType === 1 || checkNonElements ) {
  						outerCache = elem[ expando ] || (elem[ expando ] = {});
  						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
  							if ( (data = cache[1]) === true || data === cachedruns ) {
  								return data === true;
  							}
  						} else {
  							cache = outerCache[ dir ] = [ dirkey ];
  							cache[1] = matcher( elem, context, xml ) || cachedruns;
  							if ( cache[1] === true ) {
  								return true;
  							}
  						}
  					}
  				}
  			}
  		}
docs: Check against all ancestor/preceding elements