Class: Browser::DOM::Node

Inherits:
Object show all
Includes:
Native
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

Instance Attribute Details

#childNode? (readonly)

Returns the first child of the node.

Returns:

  • (Node?)

    the first child of the node


237
238
239
# File 'opal/browser/dom/node.rb', line 237

def child
  children.first
end

#childrenNodeSet

Returns the children of the node.

Returns:

  • (NodeSet)

    the children of the node


243
244
245
# File 'opal/browser/dom/node.rb', line 243

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

#documentDocument? (readonly)

Returns the document the node is attached to.

Returns:

  • (Document?)

    the document the node is attached to


258
259
260
# File 'opal/browser/dom/node.rb', line 258

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


276
277
278
# File 'opal/browser/dom/node.rb', line 276

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

#first_element_childElement? (readonly)

Returns the first element child.

Returns:

  • (Element?)

    the first element child


284
285
286
# File 'opal/browser/dom/node.rb', line 284

def first_element_child
  element_children.first
end

#inner_htmlString

Returns the inner HTML of the node.

Returns:

  • (String)

    the inner HTML of the node


295
296
297
# File 'opal/browser/dom/node.rb', line 295

def inner_html
  `#@native.innerHTML`
end

#last_element_childElement? (readonly)

Returns the last element child.

Returns:

  • (Element?)

    the last element child


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

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


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

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

#namespaceString (readonly)

Returns the namespace of the node.

Returns:

  • (String)

    the namespace of the node


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

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


330
331
332
# File 'opal/browser/dom/node.rb', line 330

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


338
339
340
341
342
343
344
345
346
# File 'opal/browser/dom/node.rb', line 338

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


356
357
358
# File 'opal/browser/dom/node.rb', line 356

def node_type
  `#@native.nodeType`
end

#parentElement?

Returns the parent of the node.

Returns:

  • (Element?)

    the parent of the node


362
363
364
# File 'opal/browser/dom/node.rb', line 362

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


387
388
389
# File 'opal/browser/dom/node.rb', line 387

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


395
396
397
398
399
400
401
402
403
# File 'opal/browser/dom/node.rb', line 395

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


450
451
452
# File 'opal/browser/dom/node.rb', line 450

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:


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

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)

58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'opal/browser/dom/node.rb', line 58

def <<(node)
  if Opal.respond_to? node, :each
    node.each { |n| self << n }
    return self
  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)

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

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

#>>(node) ⇒ Object


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

def >>(node)
  if Opal.respond_to? node, :each
    node.each { |n| self >> n }
    return self
  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


100
101
102
103
104
105
106
# File 'opal/browser/dom/node.rb', line 100

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


113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'opal/browser/dom/node.rb', line 113

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

  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


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

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

  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:


166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'opal/browser/dom/node.rb', line 166

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


155
156
157
# File 'opal/browser/dom/node.rb', line 155

def append_to(node)
  node << self
end

#blank?Boolean

Returns:

  • (Boolean)

Raises:

  • (NotImplementedError)

226
227
228
# File 'opal/browser/dom/node.rb', line 226

def blank?
  raise NotImplementedError
end

#cdata?Boolean

Return true if the node is a CDATA section.

Returns:

  • (Boolean)

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

def cdata?
  node_type == CDATA_SECTION_NODE
end

#clearObject

Remove all the children of the node.


194
195
196
# File 'opal/browser/dom/node.rb', line 194

def clear
  children.remove
end

#comment?Boolean

Return true if the node is a comment.

Returns:

  • (Boolean)

252
253
254
# File 'opal/browser/dom/node.rb', line 252

def comment?
  node_type == COMMENT_NODE
end

#contentObject Also known as: inner_text, text

Raises:

  • (NotImplementedError)

201
202
203
# File 'opal/browser/dom/node.rb', line 201

def content
  `#@native.textContent`
end

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

Raises:

  • (NotImplementedError)

205
206
207
# File 'opal/browser/dom/node.rb', line 205

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

#document?Boolean

Return true if the node is a document.

Returns:

  • (Boolean)

263
264
265
# File 'opal/browser/dom/node.rb', line 263

def document?
  node_type == DOCUMENT_NODE
end

#elem?Boolean Also known as: element?

Return true if the node is an element.

Returns:

  • (Boolean)

268
269
270
# File 'opal/browser/dom/node.rb', line 268

def elem?
  node_type == ELEMENT_NODE
end

#fragment?Boolean

Return true if the node is a document fragment.

Returns:

  • (Boolean)

289
290
291
# File 'opal/browser/dom/node.rb', line 289

def fragment?
  node_type == DOCUMENT_FRAGMENT_NODE
end

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

Raises:

  • (NotImplementedError)

370
371
372
# File 'opal/browser/dom/node.rb', line 370

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

#pathObject

Raises:

  • (NotImplementedError)

374
375
376
# File 'opal/browser/dom/node.rb', line 374

def path
  raise NotImplementedError
end

#prepend_to(node) ⇒ Object

Prepend the node to the passed one.

Parameters:

  • node (Node)

    the node to prepend to


381
382
383
# File 'opal/browser/dom/node.rb', line 381

def prepend_to(node)
  node >> self
end

#removeObject

Remove the node from its parent.


189
190
191
# File 'opal/browser/dom/node.rb', line 189

def remove
  parent.remove_child(self) if parent
end

#remove_child(node) ⇒ Object

Remove the given node from the children of this node.


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

def remove_child(node)
  `#@native.removeChild(#{Native.try_convert(node)})`
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


418
419
420
421
422
423
424
425
426
427
428
429
430
# File 'opal/browser/dom/node.rb', line 418

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

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

  node
end

#text?Boolean

Return true if the node is a text node.

Returns:

  • (Boolean)

438
439
440
# File 'opal/browser/dom/node.rb', line 438

def text?
  node_type == TEXT_NODE
end

#traverse(&block) ⇒ Object

Raises:

  • (NotImplementedError)

442
443
444
# File 'opal/browser/dom/node.rb', line 442

def traverse(&block)
  raise NotImplementedError
end