Blame view

node_modules/sockjs-client/lib/utils/event.js 1.95 KB
aaac7fed   liuqimichale   add
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
  'use strict';
  
  var random = require('./random');
  
  var onUnload = {}
    , afterUnload = false
      // detect google chrome packaged apps because they don't allow the 'unload' event
    , isChromePackagedApp = global.chrome && global.chrome.app && global.chrome.app.runtime
    ;
  
  module.exports = {
    attachEvent: function(event, listener) {
      if (typeof global.addEventListener !== 'undefined') {
        global.addEventListener(event, listener, false);
      } else if (global.document && global.attachEvent) {
        // IE quirks.
        // According to: http://stevesouders.com/misc/test-postmessage.php
        // the message gets delivered only to 'document', not 'window'.
        global.document.attachEvent('on' + event, listener);
        // I get 'window' for ie8.
        global.attachEvent('on' + event, listener);
      }
    }
  
  , detachEvent: function(event, listener) {
      if (typeof global.addEventListener !== 'undefined') {
        global.removeEventListener(event, listener, false);
      } else if (global.document && global.detachEvent) {
        global.document.detachEvent('on' + event, listener);
        global.detachEvent('on' + event, listener);
      }
    }
  
  , unloadAdd: function(listener) {
      if (isChromePackagedApp) {
        return null;
      }
  
      var ref = random.string(8);
      onUnload[ref] = listener;
      if (afterUnload) {
        setTimeout(this.triggerUnloadCallbacks, 0);
      }
      return ref;
    }
  
  , unloadDel: function(ref) {
      if (ref in onUnload) {
        delete onUnload[ref];
      }
    }
  
  , triggerUnloadCallbacks: function() {
      for (var ref in onUnload) {
        onUnload[ref]();
        delete onUnload[ref];
      }
    }
  };
  
  var unloadTriggered = function() {
    if (afterUnload) {
      return;
    }
    afterUnload = true;
    module.exports.triggerUnloadCallbacks();
  };
  
  // 'unload' alone is not reliable in opera within an iframe, but we
  // can't use `beforeunload` as IE fires it on javascript: links.
  if (!isChromePackagedApp) {
    module.exports.attachEvent('unload', unloadTriggered);
  }