UNPKG

12.2 kBJavaScriptView Raw
1/*!
2 * Copyright (c) 2017 NAVER Corp.
3 * @egjs/rotate project is licensed under the MIT <https://naver.github.io/egjs/license.txt> license
4 *
5 * @egjs/rotate JavaScript library
6 * https://github.com/naver/egjs-rotate
7 *
8 * @version 2.1.0
9 */
10(function webpackUniversalModuleDefinition(root, factory) {
11 if(typeof exports === 'object' && typeof module === 'object')
12 module.exports = factory();
13 else if(typeof define === 'function' && define.amd)
14 define("rotate", [], factory);
15 else if(typeof exports === 'object')
16 exports["rotate"] = factory();
17 else
18 root["eg"] = root["eg"] || {}, root["eg"]["rotate"] = factory();
19})(window, function() {
20return /******/ (function(modules) { // webpackBootstrap
21/******/ // The module cache
22/******/ var installedModules = {};
23/******/
24/******/ // The require function
25/******/ function __webpack_require__(moduleId) {
26/******/
27/******/ // Check if module is in cache
28/******/ if(installedModules[moduleId]) {
29/******/ return installedModules[moduleId].exports;
30/******/ }
31/******/ // Create a new module (and put it into the cache)
32/******/ var module = installedModules[moduleId] = {
33/******/ i: moduleId,
34/******/ l: false,
35/******/ exports: {}
36/******/ };
37/******/
38/******/ // Execute the module function
39/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
40/******/
41/******/ // Flag the module as loaded
42/******/ module.l = true;
43/******/
44/******/ // Return the exports of the module
45/******/ return module.exports;
46/******/ }
47/******/
48/******/
49/******/ // expose the modules object (__webpack_modules__)
50/******/ __webpack_require__.m = modules;
51/******/
52/******/ // expose the module cache
53/******/ __webpack_require__.c = installedModules;
54/******/
55/******/ // define getter function for harmony exports
56/******/ __webpack_require__.d = function(exports, name, getter) {
57/******/ if(!__webpack_require__.o(exports, name)) {
58/******/ Object.defineProperty(exports, name, {
59/******/ configurable: false,
60/******/ enumerable: true,
61/******/ get: getter
62/******/ });
63/******/ }
64/******/ };
65/******/
66/******/ // define __esModule on exports
67/******/ __webpack_require__.r = function(exports) {
68/******/ Object.defineProperty(exports, '__esModule', { value: true });
69/******/ };
70/******/
71/******/ // getDefaultExport function for compatibility with non-harmony modules
72/******/ __webpack_require__.n = function(module) {
73/******/ var getter = module && module.__esModule ?
74/******/ function getDefault() { return module['default']; } :
75/******/ function getModuleExports() { return module; };
76/******/ __webpack_require__.d(getter, 'a', getter);
77/******/ return getter;
78/******/ };
79/******/
80/******/ // Object.prototype.hasOwnProperty.call
81/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
82/******/
83/******/ // __webpack_public_path__
84/******/ __webpack_require__.p = "";
85/******/
86/******/
87/******/ // Load entry module and return exports
88/******/ return __webpack_require__(__webpack_require__.s = 0);
89/******/ })
90/************************************************************************/
91/******/ ([
92/* 0 */
93/***/ (function(module, exports, __webpack_require__) {
94
95"use strict";
96
97
98var _rotate = __webpack_require__(1);
99
100var _rotate2 = _interopRequireDefault(_rotate);
101
102function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
103
104/**
105 * Version info string
106 * @ko 버전정보 문자열
107 * @name VERSION
108 * @static
109 * @type {String}
110 * @example
111 * eg.rotate.VERSION; // ex) 2.2.0
112 * @memberof eg.rotate
113 */
114_rotate2["default"].VERSION = "2.1.0"; /**
115 * Copyright (c) 2015 NAVER Corp.
116 * egjs projects are licensed under the MIT license
117 */
118
119module.exports = _rotate2["default"];
120
121/***/ }),
122/* 1 */
123/***/ (function(module, exports, __webpack_require__) {
124
125"use strict";
126
127
128exports.__esModule = true;
129
130var _browser = __webpack_require__(2);
131
132exports["default"] = function () {
133 var beforeScreenWidth = -1;
134 var beforeVertical = null;
135 var USER_LISTENERS = []; // user's event listener
136
137 var agent = function () {
138 var ua = _browser.window.navigator.userAgent;
139 var match = ua.match(/(iPhone OS|CPU OS|Android)\s([^\s;-]+)/); // fetch Android & iOS env only
140 var res = {
141 os: "",
142 version: "",
143 ua: ua
144 };
145
146 if (match) {
147 res.os = match[1].replace(/(?:CPU|iPhone)\sOS/, "ios").toLowerCase();
148 res.version = match[2].replace(/\D/g, ".");
149 }
150
151 return res;
152 }();
153
154 var isMobile = /android|ios/.test(agent.os) || /Mobi/.test(agent.ua);
155
156 // for non-mobile, will return an empty function methods
157 if (!isMobile) {
158 var fn = function fn() {
159 return false;
160 };
161
162 return {
163 on: fn,
164 off: fn,
165 isVertical: fn
166 };
167 }
168
169 /**
170 * Return event name string for orientationChange according browser support
171 */
172 var ORIENTATION_CHANGE_EVENT = function () {
173 var type = void 0;
174
175 /**
176 * Some platform/broswer returns previous widht/height state value. For workaround, give some delays.
177 *
178 * Android bug:
179 * - Andorid 2.3 - Has orientationchange with bug. Needs 500ms delay.
180 *
181 * Note: Samsung's branded Android 2.3
182 * When check orientationchange using resize event, could cause browser crash if user binds resize event on window
183 *
184 * - Android 2.2 - orientationchange fires twice(at first time width/height are not updated, but second returns well)
185 * - Lower than 2.2 - use resize event
186 *
187 * InApp bug:
188 * - Set 200ms delay
189 */
190 if (agent.os === "android" && agent.version === "2.1") {
191 type = "resize";
192 } else {
193 type = "onorientationchange" in _browser.window ? "orientationchange" : "resize";
194 }
195
196 return type;
197 }();
198
199 /**
200 * When viewport orientation is portrait, return true otherwise false
201 */
202 function isVertical() {
203 var screenWidth = void 0;
204 var degree = void 0;
205 var vertical = void 0;
206
207 if (ORIENTATION_CHANGE_EVENT === "resize") {
208 screenWidth = _browser.document.documentElement.clientWidth;
209
210 if (beforeScreenWidth === -1) {
211 // first call isVertical
212 vertical = screenWidth < _browser.document.documentElement.clientHeight;
213 } else {
214 if (screenWidth < beforeScreenWidth) {
215 vertical = true;
216 } else if (screenWidth === beforeScreenWidth) {
217 vertical = beforeVertical;
218 } else {
219 vertical = false;
220 }
221 }
222 } else {
223 degree = _browser.window.orientation;
224
225 if (degree === 0 || degree === 180) {
226 vertical = true;
227 } else if (degree === 90 || degree === -90) {
228 vertical = false;
229 }
230 }
231 return vertical;
232 }
233
234 /**
235 * Trigger rotate event
236 */
237 function triggerRotate(e) {
238 var currentVertical = isVertical();
239
240 if (isMobile) {
241 if (beforeVertical !== currentVertical) {
242 beforeVertical = currentVertical;
243 beforeScreenWidth = _browser.document.documentElement.clientWidth;
244
245 USER_LISTENERS.forEach(function (v) {
246 return v(e, {
247 isVertical: beforeVertical
248 });
249 });
250 }
251 }
252 }
253
254 /**
255 * Trigger event handler
256 */
257 function handler(e) {
258 var rotateTimer = null;
259
260 if (ORIENTATION_CHANGE_EVENT === "resize") {
261 _browser.window.setTimeout(function () {
262 return triggerRotate(e);
263 }, 0);
264 } else {
265 if (agent.os === "android") {
266 var screenWidth = _browser.document.documentElement.clientWidth;
267
268 if (e.type === "orientationchange" && screenWidth === beforeScreenWidth) {
269 _browser.window.setTimeout(function () {
270 return handler(e);
271 }, 500);
272
273 // When width value wasn't changed after firing orientationchange, then call handler again after 300ms.
274 return false;
275 }
276 }
277
278 rotateTimer && _browser.window.clearTimeout(rotateTimer);
279 rotateTimer = _browser.window.setTimeout(function () {
280 return triggerRotate(e);
281 }, 300);
282 }
283
284 return undefined;
285 }
286
287 /**
288 * Tiny custom rotate event binder.
289 * > **NOTE:**
290 * > - It works for mobile environment only.
291 * > - For non-mobile environment, every methods will return 'false'.
292 *
293 * > **참고:**
294 * > - 모바일 환경에서만 동작 합니다.
295 * > - 비모바일 환경에서는 모든 메서드들은 'false'를 반환합니다.
296 * @ko 기기 회전에 따른 rotate 커스텀 이벤트 바인더
297 * @namespace eg.rotate
298 * @param {Event} e Native event object<ko>네이티브 이벤트 객체</ko>
299 * @param {Object} info The object of data to be sent when the event is fired<ko>이벤트가 발생할 때 전달되는 데이터 객체</ko>
300 * @param {Boolean} info.isVertical The orientation of the device (true: portrait, false: landscape) <ko>기기의 화면 방향(true: 수직 방향, false: 수평 방향)</ko>
301 * @support { "ios" : "7+", "an" : "2.1+ (except 3.x)"}
302 * @example
303 * var handler = function(e, info){
304 * info.isVertical;
305 * }
306 * // bind
307 * eg.rotate.on(handler);
308 *
309 * // unbind
310 * eg.rotate.off(handler);
311 *
312 * // unbind all event attached (call without listener param)
313 * eg.rotate.off();
314 */
315 return {
316 /**
317 * Bind rotate event
318 * @ko rotate 이벤트 바인딩
319 * @memberof eg.rotate
320 * @static
321 * @param {Function} listener listener function <ko>이벤트 핸들러 함수</ko>
322 */
323 on: function on(listener) {
324 if (typeof listener !== "function") {
325 return;
326 }
327
328 beforeVertical = isVertical();
329 beforeScreenWidth = _browser.document.documentElement.clientWidth;
330 USER_LISTENERS.push(listener);
331
332 // only attach once
333 USER_LISTENERS.length === 1 && _browser.window.addEventListener(ORIENTATION_CHANGE_EVENT, handler);
334 },
335
336
337 /**
338 * Unbind rotate event
339 * Without param, will unbind all binded listeners
340 * @ko rotate 이벤트 바인딩 해제. 파라미터 없이 호출되는 경우, 바인딩된 모든 이벤트를 해제한다.
341 * @memberof eg.rotate
342 * @static
343 * @param {Function} [listener] listener function <ko>이벤트 핸들러 함수</ko>
344 */
345 off: function off(listener) {
346 if (typeof listener === "function") {
347 // remove given listener from list
348 for (var i = 0, el; el = USER_LISTENERS[i]; i++) {
349 if (el === listener) {
350 USER_LISTENERS.splice(i, 1);
351 break;
352 }
353 }
354 }
355
356 // detach when the condition is met
357 if (!listener || USER_LISTENERS.length === 0) {
358 USER_LISTENERS.splice(0);
359 _browser.window.removeEventListener(ORIENTATION_CHANGE_EVENT, handler);
360 }
361 },
362
363
364 /**
365 * Native event name used to detect rotate
366 * @ko roate 이벤트를 위해 사용된 네이티브 이벤트 명
367 * @memberof eg.rotate
368 * @property {String} event event name <ko>이벤 명</ko>
369 * @private
370 */
371 orientationChange: ORIENTATION_CHANGE_EVENT,
372
373 /**
374 * Get device is in vertical mode
375 * @ko 화면이 수직 방향인지 여부
376 * @memberof eg.rotate
377 * @static
378 * @method
379 * @return {Boolean} The orientation of the device (true: portrait, false: landscape) <ko>기기의 화면 방향(true: 수직 방향, false: 수평 방향)</ko>
380 * @example
381 * eg.rotate.isVertical(); // Check if device is in portrait mode
382 */
383 isVertical: isVertical,
384
385 /**
386 * Trigger rotate event
387 * @memberof eg.rotate
388 * @private
389 */
390 triggerRotate: triggerRotate,
391
392 /**
393 * Event handler function
394 * @memberof eg.rotate
395 * @private
396 */
397 handler: handler
398 };
399}(); /**
400 * Copyright (c) 2015 NAVER Corp.
401 * egjs projects are licensed under the MIT license
402 */
403
404
405module.exports = exports["default"];
406
407/***/ }),
408/* 2 */
409/***/ (function(module, exports, __webpack_require__) {
410
411"use strict";
412
413
414exports.__esModule = true;
415/**
416 * Copyright (c) 2015 NAVER Corp.
417 * egjs projects are licensed under the MIT license
418 */
419/* eslint-disable no-new-func, no-nested-ternary */
420var win = typeof window !== "undefined" && window.Math === Math ? window : typeof self !== "undefined" && self.Math === Math ? self : Function("return this")();
421/* eslint-enable no-new-func, no-nested-ternary */
422
423var document = win.document;
424
425exports.window = win;
426exports.document = document;
427
428/***/ })
429/******/ ]);
430});
\No newline at end of file