|
244 | 244 |
|
245 | 245 | // Fix a Safari bug where a text node gets passed as the target of an |
246 | 246 | // anchor click rather than the anchor itself. |
247 | | - if (node.nodeType == Node.TEXT_NODE) |
248 | | - node = node.parentNode; |
249 | | - |
250 | | - return Element.extend(node); |
| 247 | + return node.nodeType == Node.TEXT_NODE ? node.parentNode : node; |
251 | 248 | } |
252 | 249 |
|
253 | 250 | /** |
|
260 | 257 | * its ancestor chain. If `expression` is not given, the element which fired |
261 | 258 | * the event is returned. |
262 | 259 | * |
263 | | - * *If no matching element is found, the document itself (`HTMLDocument` node) |
264 | | - * is returned.* |
| 260 | + * *If no matching element is found, `undefined` is returned.* |
265 | 261 | * |
266 | 262 | * ##### Example |
267 | 263 | * |
|
270 | 266 | * |
271 | 267 | * document.observe('click', function(event) { |
272 | 268 | * var element = event.findElement('p'); |
273 | | - * if (element != document) |
| 269 | + * if (element) |
274 | 270 | * $(element).hide(); |
275 | 271 | * }); |
276 | 272 | **/ |
277 | 273 | function findElement(event, expression) { |
278 | | - var element = _element(event), match = Prototype.Selector.match; |
| 274 | + var element = _element(event), selector = Prototype.Selector; |
279 | 275 | if (!expression) return Element.extend(element); |
280 | 276 | while (element) { |
281 | | - if (Object.isElement(element) && match(element, expression)) |
| 277 | + if (Object.isElement(element) && selector.match(element, expression)) |
282 | 278 | return Element.extend(element); |
283 | 279 | element = element.parentNode; |
284 | 280 | } |
|
898 | 894 | // for bulk removal of event listeners. We use them rather than recurse |
899 | 895 | // back into `stopObserving` to avoid touching the registry more often than |
900 | 896 | // necessary. |
901 | | - |
| 897 | + |
902 | 898 | // Stop observing _all_ listeners on an element. |
903 | 899 | function stopObservingElement(element) { |
904 | | - var uid = getUniqueElementID(element), |
905 | | - registry = getRegistryForElement(element, uid); |
906 | | - |
| 900 | + // Do a manual registry lookup because we don't want to create a registry |
| 901 | + // if one doesn't exist. |
| 902 | + var uid = getUniqueElementID(element), registry = GLOBAL.Event.cache[uid]; |
| 903 | + // This way we can return early if there is no registry. |
| 904 | + if (!registry) return; |
| 905 | + |
907 | 906 | destroyRegistryForElement(element, uid); |
908 | | - |
| 907 | + |
909 | 908 | var entries, i; |
910 | 909 | for (var eventName in registry) { |
911 | 910 | // Explicitly skip elements so we don't accidentally find one with a |
|
1276 | 1275 | stopObserving: stopObserving.methodize(), |
1277 | 1276 |
|
1278 | 1277 | /** |
1279 | | - * Element.on(@element, eventName[, selector], callback) -> Event.Handler |
| 1278 | + * document.on(@element, eventName[, selector], callback) -> Event.Handler |
1280 | 1279 | * |
1281 | 1280 | * See [[Event.on]]. |
1282 | 1281 | **/ |
|
1331 | 1330 | return createMouseEnterLeaveResponder(uid, eventName, handler); |
1332 | 1331 |
|
1333 | 1332 | return function(event) { |
1334 | | - var cacheEntry = Event.cache[uid]; |
1335 | | - var element = cacheEntry.element; |
1336 | | - |
| 1333 | + if (!Event.cache) return; |
| 1334 | + |
| 1335 | + var element = Event.cache[uid].element; |
1337 | 1336 | Event.extend(event, element); |
1338 | 1337 | handler.call(element, event); |
1339 | 1338 | }; |
1340 | 1339 | } |
1341 | 1340 |
|
1342 | 1341 | function createResponderForCustomEvent(uid, eventName, handler) { |
1343 | 1342 | return function(event) { |
1344 | | - var cacheEntry = Event.cache[uid], element = cacheEntry.element; |
| 1343 | + var element = Event.cache[uid].element; |
1345 | 1344 |
|
1346 | 1345 | if (Object.isUndefined(event.eventName)) |
1347 | 1346 | return false; |
|
1356 | 1355 |
|
1357 | 1356 | function createMouseEnterLeaveResponder(uid, eventName, handler) { |
1358 | 1357 | return function(event) { |
1359 | | - var cacheEntry = Event.cache[uid], element = cacheEntry.element; |
1360 | | - |
| 1358 | + var element = Event.cache[uid].element; |
| 1359 | + |
1361 | 1360 | Event.extend(event, element); |
1362 | 1361 | var parent = event.relatedTarget; |
1363 | 1362 |
|
|
1408 | 1407 |
|
1409 | 1408 | fireContentLoadedEvent(); |
1410 | 1409 | } |
| 1410 | + |
| 1411 | + |
| 1412 | + if (document.readyState === 'complete') { |
| 1413 | + // We must have been loaded asynchronously, because the DOMContentLoaded |
| 1414 | + // event has already fired. We can just fire `dom:loaded` and be done |
| 1415 | + // with it. |
| 1416 | + fireContentLoadedEvent(); |
| 1417 | + return; |
| 1418 | + } |
1411 | 1419 |
|
1412 | 1420 | if (document.addEventListener) { |
1413 | 1421 | // All browsers that support DOM L2 Events support DOMContentLoaded, |
|
0 commit comments