github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/themes/wind/static/libs/sockjs-client-1.1.0/lib/utils/event.js (about)

     1  'use strict';
     2  
     3  var random = require('./random');
     4  
     5  var onUnload = {}
     6    , afterUnload = false
     7      // detect google chrome packaged apps because they don't allow the 'unload' event
     8    , isChromePackagedApp = global.chrome && global.chrome.app && global.chrome.app.runtime
     9    ;
    10  
    11  module.exports = {
    12    attachEvent: function(event, listener) {
    13      if (typeof global.addEventListener !== 'undefined') {
    14        global.addEventListener(event, listener, false);
    15      } else if (global.document && global.attachEvent) {
    16        // IE quirks.
    17        // According to: http://stevesouders.com/misc/test-postmessage.php
    18        // the message gets delivered only to 'document', not 'window'.
    19        global.document.attachEvent('on' + event, listener);
    20        // I get 'window' for ie8.
    21        global.attachEvent('on' + event, listener);
    22      }
    23    }
    24  
    25  , detachEvent: function(event, listener) {
    26      if (typeof global.addEventListener !== 'undefined') {
    27        global.removeEventListener(event, listener, false);
    28      } else if (global.document && global.detachEvent) {
    29        global.document.detachEvent('on' + event, listener);
    30        global.detachEvent('on' + event, listener);
    31      }
    32    }
    33  
    34  , unloadAdd: function(listener) {
    35      if (isChromePackagedApp) {
    36        return null;
    37      }
    38  
    39      var ref = random.string(8);
    40      onUnload[ref] = listener;
    41      if (afterUnload) {
    42        setTimeout(this.triggerUnloadCallbacks, 0);
    43      }
    44      return ref;
    45    }
    46  
    47  , unloadDel: function(ref) {
    48      if (ref in onUnload) {
    49        delete onUnload[ref];
    50      }
    51    }
    52  
    53  , triggerUnloadCallbacks: function() {
    54      for (var ref in onUnload) {
    55        onUnload[ref]();
    56        delete onUnload[ref];
    57      }
    58    }
    59  };
    60  
    61  var unloadTriggered = function() {
    62    if (afterUnload) {
    63      return;
    64    }
    65    afterUnload = true;
    66    module.exports.triggerUnloadCallbacks();
    67  };
    68  
    69  // 'unload' alone is not reliable in opera within an iframe, but we
    70  // can't use `beforeunload` as IE fires it on javascript: links.
    71  if (!isChromePackagedApp) {
    72    module.exports.attachEvent('unload', unloadTriggered);
    73  }