1 var 2 WINDOW_APP = WINDOW_APP || {}; 3 4 WINDOW_APP.classes = WINDOW_APP.classes || {}; 5 6 7 /** 8 * ウィンドウ開閉の監視 9 * 10 * @class 11 * @param targetWindow {Object} 監視するウィンドウ 12 * @author ngi@phantom4.org 13 * @example 14 * 15 * /** 16 * * windowの状態が変わった 17 * * 18 * * @param isOpen {Boolean} 開いているか 19 * * @param target {Object} 対象のウィンドウ 20 * *\/ 21 * function onStatusChanged (isOpen, target) { 22 * alert("window.closed", isOpen, target); 23 * } 24 * 25 * var monitor = new WINDOW_APP.classes.CloseMonitor(); 26 * monitor.add(onStatusChanged); //リスナー追加 27 */ 28 WINDOW_APP.classes.CloseMonitor = function (targetWindow) { 29 var 30 _INTERVAL = 250, 31 32 _isPlaying = false, //動作中か 33 _listeners = [], //リスナー 34 _numListener = 0, //追加された要素の数 35 _timer, //タイマー 36 _prevStatus; //前回の開閉状態 37 38 /** 39 * イベントを追加する 40 * 41 * @param func {Function} リスナー 42 */ 43 function add (func) { 44 var 45 isAdded = false; //すでに追加されているか 46 47 if(typeof func === "function") { 48 //同じものがあれば上書き 49 for(var i = 0; i < _numListener; i++) { 50 if(_listeners[i] === func) { 51 _listeners[i] = func; 52 isAdded = true; 53 break; 54 } 55 } 56 57 if(!isAdded) { 58 _listeners.push(func); 59 _numListener++; 60 } 61 } 62 } 63 64 /** 65 * イベントを削除する 66 * 67 * @param func {Function} リスナー 68 */ 69 function remove (func) { 70 for(var i = 0; i < _numListener; i++) { 71 //一致したリスナーを削除 72 if(_listeners[i] === func) { 73 delete _listeners[i]; 74 _numListener--; 75 break; 76 } 77 } 78 } 79 80 /** 81 * モニターの開始(手動で実行する場合) 82 * 83 */ 84 function start () { 85 stop(); 86 87 _monitor(); 88 _timer = setInterval(_monitor, _INTERVAL); 89 _isPlaying = true; 90 } 91 92 /** 93 * モニターの停止(手動で実行する場合) 94 * 95 */ 96 function stop () { 97 if(_timer) { 98 clearInterval(_timer); 99 } 100 _isPlaying = false; 101 } 102 103 /** 104 * 監視&通知 105 * 106 */ 107 function _monitor () { 108 var 109 isOpen = Boolean(targetWindow && !targetWindow.closed); //ウィンドウが開いているか 110 111 //通知 112 if(_prevStatus != isOpen) { 113 for(var i = 0; i < _numListener; i++) { 114 _listeners[i].apply(_listeners[i], [isOpen, targetWindow]); 115 } 116 _prevStatus = isOpen; 117 } 118 } 119 120 start(); 121 122 //public 123 return { 124 add: add, 125 remove: remove, 126 start: start, 127 stop: stop 128 }; 129 }; 130 131 132