|
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