Class: Browser::DOM::Node

Inherits:
Object show all
Includes:
NativeCachedWrapper
Defined in:
opal/browser/dom/node.rb

Overview

Abstract class for all DOM node types.

Direct Known Subclasses

CharacterData, Element

Constant Summary collapse

ELEMENT_NODE =
1
ATTRIBUTE_NODE =
2
TEXT_NODE =
3
CDATA_SECTION_NODE =
4
ENTITY_REFERENCE_NOCE =
5
ENTITY_NODE =
6
PROCESSING_INSTRUCTION_NODE =
7
COMMENT_NODE =
8
DOCUMENT_NODE =
9
DOCUMENT_TYPE_NODE =
10
DOCUMENT_FRAGMENT_NODE =
11
NOTATION_NODE =
12

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from NativeCachedWrapper

#restricted?, #set_native_reference

Constructor Details

#initialize(node) ⇒ Node

Returns a new instance of Node.

Raises:

  • (ArgumentError)


42
43
44
45
# File 'opal/browser/dom/node.rb', line 42

def initialize(node)
  raise ArgumentError, "Please ensure that #initialize of #{self.class} accepts one argument" unless node
  super
end

Instance Attribute Details

#childNode? (readonly)

Returns the first child of the node.

Returns:

  • (Node?)

    the first child of the node



266
267
268
# File 'opal/browser/dom/node.rb', line 266

def child
  children.first
end

#childrenNodeSet

Returns the children of the node.

Returns:

  • (NodeSet)

    the children of the node



272
273
274
# File 'opal/browser/dom/node.rb', line 272

def children
  NodeSet[Native::Array.new(`#@native.childNodes`)]
end

#documentDocument?

Returns the document the node is attached to.

Returns:

  • (Document?)

    the document the node is attached to



292
293
294
# File 'opal/browser/dom/node.rb', line 292

def document
  DOM(`#@native.ownerDocument`) if defined?(`#@native.ownerDocument`)
end

#element_childrenNodeSet (readonly) Also known as: elements

Returns all the children which are elements.

Returns:

  • (NodeSet)

    all the children which are elements



315
316
317
# File 'opal/browser/dom/node.rb', line 315

def element_children
  children.select(&:element?)
end

#first_element_childElement? (readonly)

Returns the first element child.

Returns:

  • (Element?)

    the first element child



323
324
325
# File 'opal/browser/dom/node.rb', line 323

def first_element_child
  element_children.first
end

#last_element_childElement? (readonly)

Returns the last element child.

Returns:

  • (Element?)

    the last element child



337
338
339
# File 'opal/browser/dom/node.rb', line 337

def last_element_child
  element_children.last
end

#nameString Also known as: node_name

Returns the name of the node.

Returns:

  • (String)

    the name of the node



343
344
345
# File 'opal/browser/dom/node.rb', line 343

def name
  `#@native.nodeName || nil`
end

#namespaceString (readonly)

Returns the namespace of the node.

Returns:

  • (String)

    the namespace of the node



353
354
355
# File 'opal/browser/dom/node.rb', line 353

def namespace
  `#@native.namespaceURI || nil`
end

#nextNode? Also known as: next_sibling

Returns the next sibling of the node.

Returns:

  • (Node?)

    the next sibling of the node



359
360
361
# File 'opal/browser/dom/node.rb', line 359

def next
  DOM(`#@native.nextSibling`) if `#@native.nextSibling != null`
end

#next_elementElement? (readonly)

Returns the next element sibling of the node.

Returns:

  • (Element?)

    the next element sibling of the node



367
368
369
370
371
372
373
374
375
# File 'opal/browser/dom/node.rb', line 367

def next_element
  current = self.next

  while current && !current.element?
    current = current.next
  end

  current
end

#node_typeSymbol (readonly) Also known as: type

Returns the type of the node.

Returns:

  • (Symbol)

    the type of the node



385
386
387
# File 'opal/browser/dom/node.rb', line 385

def node_type
  `#@native.nodeType`
end

#outer_htmlString

Returns the simulated outer html of the node.

Returns:

  • (String)

    the simulated outer html of the node



391
392
393
394
395
# File 'opal/browser/dom/node.rb', line 391

def outer_html
  div = $document.create_element("DIV")
  div << self.dup
  div.inner_html
end

#parentElement?

Returns the parent of the node.

Returns:

  • (Element?)

    the parent of the node



399
400
401
# File 'opal/browser/dom/node.rb', line 399

def parent
  DOM(`#@native.parentNode`) if `#@native.parentNode != null`
end

#previousNode? Also known as: previous_sibling

Returns the previous sibling of the node.

Returns:

  • (Node?)

    the previous sibling of the node



425
426
427
# File 'opal/browser/dom/node.rb', line 425

def previous
  DOM(`#@native.previousSibling`) if `#@native.previousSibling != null`
end

#previous_elementElement? (readonly)

Returns the previous element sibling of the node.

Returns:

  • (Element?)

    the previous element sibling of the node



433
434
435
436
437
438
439
440
441
# File 'opal/browser/dom/node.rb', line 433

def previous_element
  current = self.previous

  while current && !current.element?
    current = current.previous
  end

  current
end

#valueString

Returns the value of the node.

Returns:

  • (String)

    the value of the node



491
492
493
# File 'opal/browser/dom/node.rb', line 491

def value
  `#@native.nodeValue || nil`
end

Class Method Details

.new(value) ⇒ Node

Wrap a native DOM node.

Parameters:

  • value (native)

    the native DOM node

Returns:



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'opal/browser/dom/node.rb', line 28

def self.new(value)
  if self == Node
    @classes ||= [nil, Element, Attribute, Text, CDATA, nil, nil, nil, Comment, Document, nil, DocumentFragment]

    if klass = @classes[`value.nodeType`]
      klass.new(value)
    else
      raise ArgumentError, 'cannot instantiate a non derived Node object'
    end
  else
    super
  end
end

Instance Method Details

#<<(node) ⇒ self

Append a child to the node.

When passing a String a text node will be created.

When passing an Object that responds to #each, every yielded element will be added following the same logic.

Parameters:

  • node (String, Node, #each, #to_n)

    the node to append

Returns:

  • (self)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'opal/browser/dom/node.rb', line 75

def <<(node)
  if Opal.respond_to? node, :each
    node.each { |n| self << n }
    return self
  elsif Opal.respond_to? node, :to_dom
    node = node.to_dom(document)
  end

  unless native?(node)
    if String === node
      node = `#@native.ownerDocument.createTextNode(node)`
    else
      node = Native.convert(node)
    end
  end

  `#@native.appendChild(node)`

  self
end

#==(other) ⇒ Boolean

Return true of the other element is the same underlying DOM node.

Returns:

  • (Boolean)


50
51
52
# File 'opal/browser/dom/node.rb', line 50

def ==(other)
  `#@native === #{Native.convert(other)}`
end

#>>(node) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'opal/browser/dom/node.rb', line 96

def >>(node)
  if Opal.respond_to? node, :each
    node.each { |n| self >> n }
    return self
  elsif Opal.respond_to? node, :to_dom
    node = node.to_dom(document)
  end

  unless native?(node)
    if String === node
      node = `#@native.ownerDocument.createTextNode(node)`
    else
      node = Native.convert(node)
    end
  end

  if `#@native.firstChild == null`
    `#@native.appendChild(node)`
  else
    `#@native.insertBefore(node, #@native.firstChild)`
  end

  self
end

#add_child(node = nil, &block) ⇒ Object



121
122
123
124
125
126
127
# File 'opal/browser/dom/node.rb', line 121

def add_child(node = nil, &block)
  unless node
    node = DOM(&block)
  end

  self << node
end

#add_next_sibling(node = nil, &block) ⇒ Object Also known as: after, next=

Add the passed node after this one.

When passing a String a text node will be created.

Parameters:

  • node (String, Node, #to_n) (defaults to: nil)

    the node to add



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'opal/browser/dom/node.rb', line 134

def add_next_sibling(node = nil, &block)
  unless node
    node = DOM(&block)
  end
  node = node.to_dom(document) if Opal.respond_to? node, :to_dom

  unless native?(node)
    if String === node
      node = `#@native.ownerDocument.createTextNode(node)`
    else
      node = Native.convert(node)
    end
  end

  `#@native.parentNode.insertBefore(node, #@native.nextSibling)`
end

#add_previous_sibling(node = nil, &block) ⇒ Object Also known as: before, previous=

Add the passed node before this one.

When passing a String a text node will be created.

Parameters:

  • node (String, Node, #to_n) (defaults to: nil)

    the node to add



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'opal/browser/dom/node.rb', line 156

def add_previous_sibling(node = nil, &block)
  unless node
    node = DOM(&block)
  end
  node = node.to_dom(document) if Opal.respond_to? node, :to_dom

  unless native?(node)
    if String === node
      node = `#@native.ownerDocument.createTextNode(node)`
    else
      node = Native.convert(node)
    end
  end

  `#@native.parentNode.insertBefore(node, #@native)`
end

#ancestors(expression = nil) ⇒ NodeSet

Get an array of ancestors.

Passing a selector will select the ancestors matching it.

Parameters:

  • expression (String) (defaults to: nil)

    the selector to use as filter

Returns:



190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'opal/browser/dom/node.rb', line 190

def ancestors(expression = nil)
  return NodeSet[] unless parent

  parents = [parent]

  while parent = parents.last.parent
    parents << parent
  end

  if Document === parents.last
    parents.pop
  end

  if expression
    parents.select! { |p| p =~ expression }
  end

  NodeSet.new(parents)
end

#append_to(node) ⇒ Object

Append the node to the passed one.

Parameters:

  • node (Node)

    the node to append to



178
179
180
181
# File 'opal/browser/dom/node.rb', line 178

def append_to(node)
  node << self
  self
end

#attached?Boolean

Returns:

  • (Boolean)


210
211
212
# File 'opal/browser/dom/node.rb', line 210

def attached?
  `#@native.isConnected`
end

#blank?Boolean

Returns:

  • (Boolean)

Raises:

  • (NotImplementedError)


255
256
257
# File 'opal/browser/dom/node.rb', line 255

def blank?
  raise NotImplementedError
end

#cdata?Boolean

Return true if the node is a CDATA section.

Returns:

  • (Boolean)


260
261
262
# File 'opal/browser/dom/node.rb', line 260

def cdata?
  node_type == CDATA_SECTION_NODE
end

#clearObject

Remove all the children of the node.



223
224
225
# File 'opal/browser/dom/node.rb', line 223

def clear
  children.remove
end

#comment?Boolean

Return true if the node is a comment.

Returns:

  • (Boolean)


281
282
283
# File 'opal/browser/dom/node.rb', line 281

def comment?
  node_type == COMMENT_NODE
end

#contentObject Also known as: inner_text, text

Raises:

  • (NotImplementedError)


230
231
232
# File 'opal/browser/dom/node.rb', line 230

def content
  `#@native.textContent`
end

#content=(value) ⇒ Object Also known as: inner_text=, text=

Raises:

  • (NotImplementedError)


234
235
236
# File 'opal/browser/dom/node.rb', line 234

def content=(value)
  `#@native.textContent = #{value}`
end

#custom?Boolean

Return true if the node is a custom element.

Returns:

  • (Boolean)


286
287
288
# File 'opal/browser/dom/node.rb', line 286

def custom?
  false
end

#document?Boolean

Return true if the node is a document.

Returns:

  • (Boolean)


302
303
304
# File 'opal/browser/dom/node.rb', line 302

def document?
  node_type == DOCUMENT_NODE
end

#elem?Boolean Also known as: element?

Return true if the node is an element.

Returns:

  • (Boolean)


307
308
309
# File 'opal/browser/dom/node.rb', line 307

def elem?
  node_type == ELEMENT_NODE
end

#fragment?Boolean

Return true if the node is a document fragment.

Returns:

  • (Boolean)


328
329
330
# File 'opal/browser/dom/node.rb', line 328

def fragment?
  node_type == DOCUMENT_FRAGMENT_NODE
end

#initialize_copy(old) ⇒ Object

Initialize a new node after #dup or #clone.

This method is not to be called directly. Use Node#dup or Node#clone.

This method creates a deep detached clone of a DOM subtree to be used in the same document. The new node will have all events detached.



61
62
63
# File 'opal/browser/dom/node.rb', line 61

def initialize_copy(old)
  set_native_reference `#{old.to_n}.cloneNode(true)`
end

#parse(text, options = {}) ⇒ Object

Raises:

  • (NotImplementedError)


407
408
409
# File 'opal/browser/dom/node.rb', line 407

def parse(text, options = {})
  raise NotImplementedError
end

#pathObject

Raises:

  • (NotImplementedError)


411
412
413
# File 'opal/browser/dom/node.rb', line 411

def path
  raise NotImplementedError
end

#prepend_to(node) ⇒ Object

Prepend the node to the passed one.

Parameters:

  • node (Node)

    the node to prepend to



418
419
420
421
# File 'opal/browser/dom/node.rb', line 418

def prepend_to(node)
  node >> self
  self
end

#removeObject

Remove the node from its parent.



217
218
219
220
# File 'opal/browser/dom/node.rb', line 217

def remove
  parent.remove_child(self) if parent
  self
end

#remove_child(node) ⇒ Object

Remove the given node from the children of this node.



446
447
448
449
# File 'opal/browser/dom/node.rb', line 446

def remove_child(node)
  `#@native.removeChild(#{Native.try_convert(node)})`
  self
end

#replace(node) ⇒ Node Also known as: replace_with

TODO:

implement for NodeSet

Replace the node with the given one.

Parameters:

  • node (Node)

    the node to replace with

Returns:

  • (Node)

    the passed node



457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
# File 'opal/browser/dom/node.rb', line 457

def replace(node)
  node = node.to_dom(document) if Opal.respond_to? node, :to_dom

  unless native?(node)
    if String === node
      node = `#@native.ownerDocument.createTextNode(node)`
    else
      node = Native.convert(node)
    end
  end

  `#@native.parentNode.replaceChild(node, #@native)`

  DOM(node)
end

#text?Boolean

Return true if the node is a text node.

Returns:

  • (Boolean)


479
480
481
# File 'opal/browser/dom/node.rb', line 479

def text?
  node_type == TEXT_NODE
end

#traverse(&block) ⇒ Object

Raises:

  • (NotImplementedError)


483
484
485
# File 'opal/browser/dom/node.rb', line 483

def traverse(&block)
  raise NotImplementedError
end