aboutsummaryrefslogtreecommitdiff
path: root/files/es/web/api/mutationobserver/index.html
blob: f0fe2a4b016662a4493006e267024c757aebec83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
---
title: MutationObserver
slug: Web/API/MutationObserver
translation_of: Web/API/MutationObserver
---
<p>{{APIRef("DOM")}}</p>

<p><code>MutationObserver</code> establece un mecanismo para reaccionar ante cambios en el <a href="/en-US/docs/DOM">DOM</a>. Ha sido diseñado como un sustituto de los <a href="/en-US/docs/DOM/Mutation_events">Mutation Events</a> definidos en las especificaciones de <em>DOM3 Events</em>.</p>

<h2 id="Constructor" name="Constructor">Constructor</h2>

<h3 id="MutationObserver()" name="MutationObserver()"><code>MutationObserver()</code></h3>

<p>Constructor para la instaciación de nuevos <em>DOM mutation observers</em>.</p>

<pre class="eval">MutationObserver(
  function callback
);
</pre>

<h6 id="Parameters" name="Parameters">Parámetros</h6>

<dl>
 <dt><code>callback</code></dt>
 <dd>La función que será llamada en cada mutación del DOM. El <em>observer</em> llamará a esta función con dos argumentos. El primero es un array de objetos, cada uno del tipo <a href="#MutationRecord"><code>MutationRecord</code></a>. El segundo es la propia instancia del <code>MutationObserver</code>.</dd>
</dl>

<h2 id="Instance_methods" name="Instance_methods">Métodos</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <td><code>void <a href="#observe()">observe</a>( {{domxref("Node")}} target, <a href="#MutationObserverInit">MutationObserverInit</a> options );</code></td>
  </tr>
  <tr>
   <td><code>void <a href="#disconnect()">disconnect</a>();</code></td>
  </tr>
  <tr>
   <td><code>Array <a href="#takeRecords()">takeRecords</a>();</code></td>
  </tr>
 </tbody>
</table>

<h3 id="observe()" name="observe()"><code>observe()</code></h3>

<p>Registra la instancia del <code>MutationObserver</code>  para recibir notificaciones de las mutaciones del DOM sobre el nodo especificado.</p>

<pre class="eval">void observe(
  {{domxref("Node")}} target,
  <a href="#MutationObserverInit"><code>MutationObserverInit</code></a> options
);
</pre>

<h6 id="Parameters" name="Parameters">Parámetros</h6>

<dl>
 <dt><code>target</code></dt>
 <dd>El {{domxref("Node")}} sobre el que observar las mutaciones del DOM.</dd>
 <dt><code>options</code></dt>
 <dd><code>Un objeto <a href="#MutationObserverInit">MutationObserverInit</a></code>, que especifica que mutaciones del DOM deben ser informadas.</dd>
</dl>

<div class="note">NOTA: Añadir un observador a un elemento es igual que addEventListener, si usted observa el elemento múltiples veces no hace ninguna diferencia. Si se observa dos veces un elemento, el observe callback no se ejecutará dos veces, ni tampoco tendrá que ejecutar disconnect() dos veces. En otras palabras, una vez el elemento es observado, observarlo de nuevo con la misma instancia del observador no hará nada. Sin embargo, si el callback es diferente por supuesto se le añadirá otro observador.</div>

<h3 id="disconnect()" name="disconnect()"><code>disconnect()</code></h3>

<p>Evita que la instancia <code>de MutationObserver</code> continue recibiendo notificaciones de modificaciones del DOM. Hasta que el método <a href="#observe()"><code>observe()</code></a> sea usado de nuevo, la función callback no será invocada.</p>

<pre class="eval">void disconnect();
</pre>

<h3 id="takeRecords()" name="takeRecords()"><code>takeRecords()</code></h3>

<p>Vacía la cola de registros de la instancia de <code>MutationObserver</code> devolviendo su contenido.</p>

<pre class="eval">Array takeRecords();
</pre>

<h6 id="Return_value" name="Return_value">Return value</h6>

<p>Returns an Array of <a href="#MutationRecord"><code>MutationRecord</code>s</a>.</p>

<h2 id="MutationObserverInit" name="MutationObserverInit"><code>MutationObserverInit</code></h2>

<p><code>MutationObserverInit</code> es un objeto para el que se pueden especificar las siguientes propiedades:</p>

<div class="note">NOTA: Como mínimo las propiedades <code>childList</code>, <code>attributes</code>, o <code>characterData </code>deben ser <code>true</code>. En caso contrario, se producirá un error "An invalid or illegal string was specified"</div>

<table class="standard-table">
 <tbody>
  <tr>
   <td class="header">Propiedad</td>
   <td class="header">Descripción</td>
  </tr>
  <tr>
   <td><code>childList</code></td>
   <td>
    <p>Establecer a <code>true</code> si la adición y/o eliminación de elementos hijo del nodo (incluso los nodos <code>text</code>) han se ser observados.</p>
   </td>
  </tr>
  <tr>
   <td><code>attributes</code></td>
   <td>
    <p>Establecer a <code>true</code> si los cambios en los atributos deben ser observados</p>
   </td>
  </tr>
  <tr>
   <td><code>characterData</code></td>
   <td>
    <p>Establecer a <code>true</code> si los cambios en los datos deben ser observados</p>
   </td>
  </tr>
  <tr>
   <td><code>subtree</code></td>
   <td>
    <p>Establecer a <code>true</code> si los cambios tambien deben ser observados en los descendientes.</p>
   </td>
  </tr>
  <tr>
   <td><code>attributeOldValue</code></td>
   <td>
    <p>Establecer a <code>true</code> si <code>attributes</code> es <code>true</code> y el valor anterior al cambio debe ser guardado.</p>
   </td>
  </tr>
  <tr>
   <td><code>characterDataOldValue</code></td>
   <td>
    <p>Establecer a <code>true</code> si <code>characterData</code> vale <code>true</code> y el dato anterior al cambio de be ser guardado.</p>
   </td>
  </tr>
  <tr>
   <td><code>attributeFilter</code></td>
   <td>
    <p>Asigne un array de nombres de atributos locales (sin su espacio de nombres) si no necesita observar los cambios en todos los atributos</p>
   </td>
  </tr>
 </tbody>
</table>

<h2 id="MutationRecord" name="MutationRecord"><code>MutationRecord</code></h2>

<p><code>MutationRecord</code> es el objeto que será pasado a la funcion "callback" del observador. Tiene las siguientes propiedades:</p>

<table class="standard-table">
 <tbody>
  <tr>
   <td class="header">Propiedad</td>
   <td class="header">Tipo</td>
   <td class="header">Descripción</td>
  </tr>
  <tr>
   <td><code>type</code></td>
   <td><code>String</code></td>
   <td>
    <p>Devuelve:</p>

    <ul>
     <li><code>attributes </code>si el cambio fué en un atributo</li>
     <li><code>characterData</code> si se produjo en un nodo.</li>
     <li><code>childList</code> si se produjo en los nodos del árbol.</li>
    </ul>

    <dl>
    </dl>
   </td>
  </tr>
  <tr>
   <td><code>target</code></td>
   <td><code>{{domxref("Node")}}</code></td>
   <td>
    <p>Devuelve el<strong> nodo</strong> afectado por el cambio, dependiendo del <code>type</code>:</p>

    <ul>
     <li>Para <code>attributes</code>, el elemento cuyos atributos han cambiado.</li>
     <li>Para <code>characterData</code>, el nodo <code>CharacterData</code>.</li>
     <li>Para <code>childList</code>, El nodo padre cuyos hijos han cambiado.</li>
    </ul>
   </td>
  </tr>
  <tr>
   <td><code>addedNodes</code></td>
   <td><code>{{domxref("NodeList")}}</code></td>
   <td>
    <p>Devuelve los nodos añadidos. Si no tiene nodos añadidos devuelve un <span style="font-family: courier new,andale mono,monospace;">NodeList</span> vacio.</p>
   </td>
  </tr>
  <tr>
   <td><code>removedNodes</code></td>
   <td><code>{{domxref("NodeList")}}</code></td>
   <td>
    <p>Devuelve los nodos eliminados. Si no tiene nodos eliminados devuelve un <span style="font-family: courier new,andale mono,monospace;">NodeList</span> vacio.</p>
   </td>
  </tr>
  <tr>
   <td><code>previousSibling</code></td>
   <td><code>{{domxref("Node")}}</code></td>
   <td>
    <p>Devuelve el nodo hermano <strong>anterior</strong> añadido o eliminado, o el valor <code>null</code>.</p>
   </td>
  </tr>
  <tr>
   <td><code>nextSibling</code></td>
   <td><code>{{domxref("Node")}}</code></td>
   <td>
    <p>Devuelve el <strong>siguiente</strong> nodo hermano añadido o eliminado, o el valor <code>null</code>.</p>
   </td>
  </tr>
  <tr>
   <td><code>attributeName</code></td>
   <td><code>String</code></td>
   <td>
    <p>Devuelve el nombre local del atributo cambiado, o el valor <code>null</code>.</p>
   </td>
  </tr>
  <tr>
   <td><code>attributeNamespace</code></td>
   <td><code>String</code></td>
   <td>
    <p>Devuelve espacio de nombres (namespace) del atributo cambiado, o el valor <code>null</code>.</p>
   </td>
  </tr>
  <tr>
   <td><code>oldValue</code></td>
   <td><code>String</code></td>
   <td>
    <p>El valor devuelto depende del <code>type</code>:</p>

    <ul>
     <li>Para <code>attributes</code>,el valor anterior del atributo.</li>
     <li>Para <code>characterData</code>,los datos antes del cambio</li>
     <li>Para <code>childList</code>,devuelve <code>null</code>.</li>
    </ul>
   </td>
  </tr>
 </tbody>
</table>

<h2 id="Example_usage" name="Example_usage">Ejemplo de uso</h2>

<p>El siguiente ejemplo fué tomado de: <a class="external" href="http://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/" rel="freelink">this blog post</a>.</p>

<pre class="brush: js">// selecciona el nodo target
var target = document.querySelector('#some-id');

// Crea una instancia de observer
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });
});

// Configura el observer:
var config = { attributes: true, childList: true, characterData: true };

// pasa al observer el nodo y la configuracion
observer.observe(target, config);

// Posteriormente, puede detener la observacion
observer.disconnect();
</pre>

<h2 id="Additional_reading" name="Additional_reading">Lectura adicional</h2>

<ul>
 <li><a class="external" href="http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers" rel="freelink">A brief overview</a></li>
 <li><a class="external" href="http://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/" rel="freelink">A more in-depth discussion</a></li>
 <li><a class="external" href="http://www.youtube.com/watch?v=eRZ4pO0gVWw" rel="freelink">A screencast by Chromium developer Rafael Weinstein</a></li>
 <li><a class="external" href="http://code.google.com/p/mutation-summary/" rel="freelink">The mutation summary library</a></li>
 <li><a href="http://dom.spec.whatwg.org/#mutation-observers">The DOM standard</a> which defines the <code>MutationObserver</code> interface</li>
</ul>

<h2 id="Compatibilidad_en_navegadores">Compatibilidad en navegadores</h2>

<p>{{ CompatibilityTable() }}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>18 {{ property_prefix("-webkit") }}<br>
    26</td>
   <td>{{ CompatGeckoDesktop(14) }}</td>
   <td>11</td>
   <td>15</td>
   <td>6.0 {{ property_prefix("-webkit") }}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Chrome for Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE  (Windows Phone) </th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{ CompatUnknown() }}</td>
   <td>18 {{ property_prefix("-webkit") }}<br>
    26</td>
   <td>{{ CompatGeckoMobile(14) }}</td>
   <td><span style="font-size: 12px; line-height: 18px;">11 (8.1)</span></td>
   <td>15</td>
   <td>
    <p>6 {{ property_prefix("-webkit")}}</p>

    <p>7</p>
   </td>
  </tr>
 </tbody>
</table>
</div>

<p> </p>