browser.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /**
  2. * 浏览器判断模块
  3. * @file
  4. * @module UE.browser
  5. * @since 1.2.6.1
  6. */
  7. /**
  8. * 提供浏览器检测的模块
  9. * @unfile
  10. * @module UE.browser
  11. */
  12. var browser = (UE.browser = (function() {
  13. var agent = navigator.userAgent.toLowerCase(),
  14. opera = window.opera,
  15. browser = {
  16. /**
  17. * @property {boolean} ie 检测当前浏览器是否为IE
  18. * @example
  19. * ```javascript
  20. * if ( UE.browser.ie ) {
  21. * console.log( '当前浏览器是IE' );
  22. * }
  23. * ```
  24. */
  25. ie: /(msie\s|trident.*rv:)([\w.]+)/i.test(agent),
  26. /**
  27. * @property {boolean} opera 检测当前浏览器是否为Opera
  28. * @example
  29. * ```javascript
  30. * if ( UE.browser.opera ) {
  31. * console.log( '当前浏览器是Opera' );
  32. * }
  33. * ```
  34. */
  35. opera: !!opera && opera.version,
  36. /**
  37. * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器
  38. * @example
  39. * ```javascript
  40. * if ( UE.browser.webkit ) {
  41. * console.log( '当前浏览器是webkit内核浏览器' );
  42. * }
  43. * ```
  44. */
  45. webkit: agent.indexOf(" applewebkit/") > -1,
  46. /**
  47. * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下
  48. * @example
  49. * ```javascript
  50. * if ( UE.browser.mac ) {
  51. * console.log( '当前浏览器运行在mac平台下' );
  52. * }
  53. * ```
  54. */
  55. mac: agent.indexOf("macintosh") > -1,
  56. /**
  57. * @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下
  58. * @example
  59. * ```javascript
  60. * if ( UE.browser.quirks ) {
  61. * console.log( '当前浏览器运行处于“怪异模式”' );
  62. * }
  63. * ```
  64. */
  65. quirks: document.compatMode == "BackCompat"
  66. };
  67. /**
  68. * @property {boolean} gecko 检测当前浏览器内核是否是gecko内核
  69. * @example
  70. * ```javascript
  71. * if ( UE.browser.gecko ) {
  72. * console.log( '当前浏览器内核是gecko内核' );
  73. * }
  74. * ```
  75. */
  76. browser.gecko =
  77. navigator.product == "Gecko" &&
  78. !browser.webkit &&
  79. !browser.opera &&
  80. !browser.ie;
  81. var version = 0;
  82. // Internet Explorer 6.0+
  83. if (browser.ie) {
  84. var v1 = agent.match(/(?:msie\s([\w.]+))/);
  85. var v2 = agent.match(/(?:trident.*rv:([\w.]+))/);
  86. if (v1 && v2 && v1[1] && v2[1]) {
  87. version = Math.max(v1[1] * 1, v2[1] * 1);
  88. } else if (v1 && v1[1]) {
  89. version = v1[1] * 1;
  90. } else if (v2 && v2[1]) {
  91. version = v2[1] * 1;
  92. } else {
  93. version = 0;
  94. }
  95. browser.ie11Compat = document.documentMode == 11;
  96. /**
  97. * @property { boolean } ie9Compat 检测浏览器模式是否为 IE9 兼容模式
  98. * @warning 如果浏览器不是IE, 则该值为undefined
  99. * @example
  100. * ```javascript
  101. * if ( UE.browser.ie9Compat ) {
  102. * console.log( '当前浏览器运行在IE9兼容模式下' );
  103. * }
  104. * ```
  105. */
  106. browser.ie9Compat = document.documentMode == 9;
  107. /**
  108. * @property { boolean } ie8 检测浏览器是否是IE8浏览器
  109. * @warning 如果浏览器不是IE, 则该值为undefined
  110. * @example
  111. * ```javascript
  112. * if ( UE.browser.ie8 ) {
  113. * console.log( '当前浏览器是IE8浏览器' );
  114. * }
  115. * ```
  116. */
  117. browser.ie8 = !!document.documentMode;
  118. /**
  119. * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式
  120. * @warning 如果浏览器不是IE, 则该值为undefined
  121. * @example
  122. * ```javascript
  123. * if ( UE.browser.ie8Compat ) {
  124. * console.log( '当前浏览器运行在IE8兼容模式下' );
  125. * }
  126. * ```
  127. */
  128. browser.ie8Compat = document.documentMode == 8;
  129. /**
  130. * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式
  131. * @warning 如果浏览器不是IE, 则该值为undefined
  132. * @example
  133. * ```javascript
  134. * if ( UE.browser.ie7Compat ) {
  135. * console.log( '当前浏览器运行在IE7兼容模式下' );
  136. * }
  137. * ```
  138. */
  139. browser.ie7Compat =
  140. (version == 7 && !document.documentMode) || document.documentMode == 7;
  141. /**
  142. * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式
  143. * @warning 如果浏览器不是IE, 则该值为undefined
  144. * @example
  145. * ```javascript
  146. * if ( UE.browser.ie6Compat ) {
  147. * console.log( '当前浏览器运行在IE6模式或者怪异模式下' );
  148. * }
  149. * ```
  150. */
  151. browser.ie6Compat = version < 7 || browser.quirks;
  152. browser.ie9above = version > 8;
  153. browser.ie9below = version < 9;
  154. browser.ie11above = version > 10;
  155. browser.ie11below = version < 11;
  156. }
  157. // Gecko.
  158. if (browser.gecko) {
  159. var geckoRelease = agent.match(/rv:([\d\.]+)/);
  160. if (geckoRelease) {
  161. geckoRelease = geckoRelease[1].split(".");
  162. version =
  163. geckoRelease[0] * 10000 +
  164. (geckoRelease[1] || 0) * 100 +
  165. (geckoRelease[2] || 0) * 1;
  166. }
  167. }
  168. /**
  169. * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号
  170. * @warning 如果浏览器不是chrome, 则该值为undefined
  171. * @example
  172. * ```javascript
  173. * if ( UE.browser.chrome ) {
  174. * console.log( '当前浏览器是Chrome' );
  175. * }
  176. * ```
  177. */
  178. if (/chrome\/(\d+\.\d)/i.test(agent)) {
  179. browser.chrome = +RegExp["\x241"];
  180. }
  181. /**
  182. * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号
  183. * @warning 如果浏览器不是safari, 则该值为undefined
  184. * @example
  185. * ```javascript
  186. * if ( UE.browser.safari ) {
  187. * console.log( '当前浏览器是Safari' );
  188. * }
  189. * ```
  190. */
  191. if (
  192. /(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) &&
  193. !/chrome/i.test(agent)
  194. ) {
  195. browser.safari = +(RegExp["\x241"] || RegExp["\x242"]);
  196. }
  197. // Opera 9.50+
  198. if (browser.opera) version = parseFloat(opera.version());
  199. // WebKit 522+ (Safari 3+)
  200. if (browser.webkit)
  201. version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]);
  202. /**
  203. * @property { Number } version 检测当前浏览器版本号
  204. * @remind
  205. * <ul>
  206. * <li>IE系列返回值为5,6,7,8,9,10等</li>
  207. * <li>gecko系列会返回10900,158900等</li>
  208. * <li>webkit系列会返回其build号 (如 522等)</li>
  209. * </ul>
  210. * @example
  211. * ```javascript
  212. * console.log( '当前浏览器版本号是: ' + UE.browser.version );
  213. * ```
  214. */
  215. browser.version = version;
  216. /**
  217. * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容
  218. * @example
  219. * ```javascript
  220. * if ( UE.browser.isCompatible ) {
  221. * console.log( '浏览器与UEditor能够良好兼容' );
  222. * }
  223. * ```
  224. */
  225. browser.isCompatible =
  226. !browser.mobile &&
  227. ((browser.ie && version >= 6) ||
  228. (browser.gecko && version >= 10801) ||
  229. (browser.opera && version >= 9.5) ||
  230. (browser.air && version >= 1) ||
  231. (browser.webkit && version >= 522) ||
  232. false);
  233. return browser;
  234. })());
  235. //快捷方式
  236. var ie = browser.ie,
  237. webkit = browser.webkit,
  238. gecko = browser.gecko,
  239. opera = browser.opera;