You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

91 lines
2.7 KiB

  1. /*
  2. * Element Traversal methods from Juriy Zaytsev (kangax)
  3. * used to emulate Prototype up/down/previous/next methods
  4. */
  5. (function(D){
  6. // TODO: all of this needs tests
  7. var match = D.match, select = D.select, root = document.documentElement,
  8. // Use the Element Traversal API if available.
  9. nextElement = 'nextElementSibling',
  10. previousElement = 'previousElementSibling',
  11. parentElement = 'parentElement';
  12. // Fall back to the DOM Level 1 API.
  13. if (!(nextElement in root)) nextElement = 'nextSibling';
  14. if (!(previousElement in root)) previousElement = 'previousSibling';
  15. if (!(parentElement in root)) parentElement = 'parentNode';
  16. function walkElements(property, element, expr) {
  17. var i = 0, isIndex = typeof expr == 'number';
  18. if (typeof expr == 'undefined') {
  19. isIndex = true;
  20. expr = 0;
  21. }
  22. while ((element = element[property])) {
  23. if (element.nodeType != 1) continue;
  24. if (isIndex) {
  25. ++i;
  26. if (i == expr) return element;
  27. } else if (match(element, expr)) {
  28. return element;
  29. }
  30. }
  31. return null;
  32. }
  33. /**
  34. * @method up
  35. * @param {HTMLElement} element element to walk from
  36. * @param {String | Number} expr CSS expression or an index
  37. * @return {HTMLElement | null}
  38. */
  39. function up(element, expr) {
  40. return walkElements(parentElement, element, expr);
  41. }
  42. /**
  43. * @method next
  44. * @param {HTMLElement} element element to walk from
  45. * @param {String | Number} expr CSS expression or an index
  46. * @return {HTMLElement | null}
  47. */
  48. function next(element, expr) {
  49. return walkElements(nextElement, element, expr);
  50. }
  51. /**
  52. * @method previous
  53. * @param {HTMLElement} element element to walk from
  54. * @param {String | Number} expr CSS expression or an index
  55. * @return {HTMLElement | null}
  56. */
  57. function previous(element, expr) {
  58. return walkElements(previousElement, element, expr);
  59. }
  60. /**
  61. * @method down
  62. * @param {HTMLElement} element element to walk from
  63. * @param {String | Number} expr CSS expression or an index
  64. * @return {HTMLElement | null}
  65. */
  66. function down(element, expr) {
  67. var isIndex = typeof expr == 'number', descendants, index, descendant;
  68. if (expr === null) {
  69. element = element.firstChild;
  70. while (element && element.nodeType != 1) element = element[nextElement];
  71. return element;
  72. }
  73. if (!isIndex && match(element, expr) || isIndex && expr === 0) return element;
  74. descendants = select('*', element);
  75. if (isIndex) return descendants[expr] || null;
  76. index = 0;
  77. while ((descendant = descendants[index]) && !match(descendant, expr)) { ++index; }
  78. return descendant || null;
  79. }
  80. D.up = up;
  81. D.down = down;
  82. D.next = next;
  83. D.previous = previous;
  84. })(NW.Dom);