4

I have a node that I'm note sure is an element (from calling node.previousSibling). However I am having trouble finding out the cross browser javascript way to access the Node constants shown on the MDC.

In all browsers but IE Node.ELEMENT_NODE is defined. I tried using a specific instance of node, e.g.:

e=$("#element_id")[0];
alert("ELEMENT_NODE: " + ELEMENT_NODE);

This does not work in IE either. So whats the IE way to do this? Do I just have to define the node constants myself?

Justin Dearing
  • 14,270
  • 22
  • 88
  • 161

3 Answers3

6

Internet Explorer 8 and earlier don't define the node type constants, so you would have to define them yourself. Additionally, Internet Explorer 7 and earlier only support types 1 and 3.

aebabis
  • 3,657
  • 3
  • 22
  • 40
Greg
  • 316,276
  • 54
  • 369
  • 333
  • 1
    MSDN may say `nodeType`'s values can only be 1 or 3, but it's not true. `document.nodeType` returns 9, for example, in IE 7. `document.createComment("foo").nodeType` returns 8. – Tim Down Jun 16 '11 at 09:39
1

The cleanest way to define the Node Constants [when they don't exist] is by catching the exception generated when attempting to access them.

try {
    if (Node.ELEMENT_NODE != 1) {
        throw true;
    }
}
catch(e) {
    document.Node = Node || {};
    Node.ELEMENT_NODE   = 1;
    Node.ATTRIBUTE_NODE = 2;
    Node.TEXT_NODE      = 3;
}

The throw true line only executes when Node exists, but Node.ELEMENT_NODE is not the expected value.

Jason Oster
  • 1,386
  • 1
  • 13
  • 17
  • This won't do what you said it does as long as `Node` is defined; `Node.ELEMENT_NODE` will just be undefined, and so the `throw true` line definitely does end up getting executed. – Gijs Dec 06 '13 at 13:37
  • @Gijs That's incorrect. This code explicitly throws if `Node` is defined but `Node.ELEMENT_NODE` is not equal to `1`. – Jason Oster Dec 08 '13 at 03:39
  • @Gijs My apologies, I didn't fully read your statement. You are correct. I've edited my answer to reflect the logic more closely. – Jason Oster Dec 08 '13 at 03:46
0
alert(oNode.nodeType)

and you'll get:

"1" for ELEMENT_NODE  
"2" for ATTRIBUTE_NODE  
"3" for TEXT_NODE   
"4" for CDATA_SECTION_NODE  
"5" for ENTITY_REFERENCE_NODE   
"6" for ENTITY_NODE

etc...

stealthyninja
  • 10,343
  • 11
  • 51
  • 59