398 lines
13 KiB
JavaScript
398 lines
13 KiB
JavaScript
![]() |
"use strict";
|
|||
|
|
|||
|
import {MyDocItem} from "../model/MyDocItem.js";
|
|||
|
import {MyMapItem} from "../model/MyMapItem.js";
|
|||
|
|
|||
|
export class MyUtils {
|
|||
|
//todo 判断是哪一种浏览器类型。以及是否是手机
|
|||
|
//todo 初始化屏幕宽高比
|
|||
|
|
|||
|
|
|||
|
MyBrowser = null
|
|||
|
|
|||
|
constructor() {
|
|||
|
/**
|
|||
|
* 提供浏览器检测的模块
|
|||
|
* @unfile
|
|||
|
* @module UE.browser
|
|||
|
*/
|
|||
|
window.browser = ((function () {
|
|||
|
var agent = navigator.userAgent.toLowerCase(),
|
|||
|
opera = window.opera,
|
|||
|
browser = {
|
|||
|
/**
|
|||
|
* @property {boolean} ie 检测当前浏览器是否为IE
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.ie ) {
|
|||
|
* console.log( '当前浏览器是IE' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
ie: /(msie\s|trident.*rv:)([\w.]+)/i.test(agent),
|
|||
|
|
|||
|
/**
|
|||
|
* @property {boolean} opera 检测当前浏览器是否为Opera
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.opera ) {
|
|||
|
* console.log( '当前浏览器是Opera' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
opera: !!opera && opera.version,
|
|||
|
|
|||
|
/**
|
|||
|
* @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.webkit ) {
|
|||
|
* console.log( '当前浏览器是webkit内核浏览器' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
webkit: agent.indexOf(" applewebkit/") > -1,
|
|||
|
|
|||
|
/**
|
|||
|
* @property {boolean} mac 检测当前浏览器是否是运行在mac平台下
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.mac ) {
|
|||
|
* console.log( '当前浏览器运行在mac平台下' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
mac: agent.indexOf("macintosh") > -1,
|
|||
|
|
|||
|
/**
|
|||
|
* @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.quirks ) {
|
|||
|
* console.log( '当前浏览器运行处于“怪异模式”' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
quirks: document.compatMode == "BackCompat"
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @property {boolean} gecko 检测当前浏览器内核是否是gecko内核
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.gecko ) {
|
|||
|
* console.log( '当前浏览器内核是gecko内核' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.gecko =
|
|||
|
navigator.product == "Gecko" &&
|
|||
|
!browser.webkit &&
|
|||
|
!browser.opera &&
|
|||
|
!browser.ie
|
|||
|
|
|||
|
var version = 0
|
|||
|
|
|||
|
// Internet Explorer 6.0+
|
|||
|
if (browser.ie) {
|
|||
|
var v1 = agent.match(/(?:msie\s([\w.]+))/)
|
|||
|
var v2 = agent.match(/(?:trident.*rv:([\w.]+))/)
|
|||
|
if (v1 && v2 && v1[1] && v2[1]) {
|
|||
|
version = Math.max(v1[1] * 1, v2[1] * 1)
|
|||
|
} else if (v1 && v1[1]) {
|
|||
|
version = v1[1] * 1
|
|||
|
} else if (v2 && v2[1]) {
|
|||
|
version = v2[1] * 1
|
|||
|
} else {
|
|||
|
version = 0
|
|||
|
}
|
|||
|
|
|||
|
browser.ie11Compat = document.documentMode == 11
|
|||
|
/**
|
|||
|
* @property { boolean } ie9Compat 检测浏览器模式是否为 IE9 兼容模式
|
|||
|
* @warning 如果浏览器不是IE, 则该值为undefined
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.ie9Compat ) {
|
|||
|
* console.log( '当前浏览器运行在IE9兼容模式下' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.ie9Compat = document.documentMode == 9
|
|||
|
|
|||
|
/**
|
|||
|
* @property { boolean } ie8 检测浏览器是否是IE8浏览器
|
|||
|
* @warning 如果浏览器不是IE, 则该值为undefined
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.ie8 ) {
|
|||
|
* console.log( '当前浏览器是IE8浏览器' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.ie8 = !!document.documentMode
|
|||
|
|
|||
|
/**
|
|||
|
* @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式
|
|||
|
* @warning 如果浏览器不是IE, 则该值为undefined
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.ie8Compat ) {
|
|||
|
* console.log( '当前浏览器运行在IE8兼容模式下' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.ie8Compat = document.documentMode == 8
|
|||
|
|
|||
|
/**
|
|||
|
* @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式
|
|||
|
* @warning 如果浏览器不是IE, 则该值为undefined
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.ie7Compat ) {
|
|||
|
* console.log( '当前浏览器运行在IE7兼容模式下' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.ie7Compat =
|
|||
|
(version == 7 && !document.documentMode) || document.documentMode == 7
|
|||
|
|
|||
|
/**
|
|||
|
* @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式
|
|||
|
* @warning 如果浏览器不是IE, 则该值为undefined
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.ie6Compat ) {
|
|||
|
* console.log( '当前浏览器运行在IE6模式或者怪异模式下' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.ie6Compat = version < 7 || browser.quirks
|
|||
|
|
|||
|
browser.ie9above = version > 8
|
|||
|
|
|||
|
browser.ie9below = version < 9
|
|||
|
|
|||
|
browser.ie11above = version > 10
|
|||
|
|
|||
|
browser.ie11below = version < 11
|
|||
|
}
|
|||
|
|
|||
|
// Gecko.
|
|||
|
if (browser.gecko) {
|
|||
|
var geckoRelease = agent.match(/rv:([\d\.]+)/)
|
|||
|
if (geckoRelease) {
|
|||
|
geckoRelease = geckoRelease[1].split(".")
|
|||
|
version =
|
|||
|
geckoRelease[0] * 10000 +
|
|||
|
(geckoRelease[1] || 0) * 100 +
|
|||
|
(geckoRelease[2] || 0) * 1
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号
|
|||
|
* @warning 如果浏览器不是chrome, 则该值为undefined
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.chrome ) {
|
|||
|
* console.log( '当前浏览器是Chrome' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
if (/chrome\/(\d+\.\d)/i.test(agent)) {
|
|||
|
browser.chrome = +RegExp["\x241"]
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号
|
|||
|
* @warning 如果浏览器不是safari, 则该值为undefined
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.safari ) {
|
|||
|
* console.log( '当前浏览器是Safari' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
if (
|
|||
|
/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) &&
|
|||
|
!/chrome/i.test(agent)
|
|||
|
) {
|
|||
|
browser.safari = +(RegExp["\x241"] || RegExp["\x242"])
|
|||
|
}
|
|||
|
|
|||
|
// Opera 9.50+
|
|||
|
if (browser.opera) version = parseFloat(opera.version())
|
|||
|
|
|||
|
// WebKit 522+ (Safari 3+)
|
|||
|
if (browser.webkit)
|
|||
|
version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1])
|
|||
|
|
|||
|
/**
|
|||
|
* @property { Number } version 检测当前浏览器版本号
|
|||
|
* @remind
|
|||
|
* <ul>
|
|||
|
* <li>IE系列返回值为5,6,7,8,9,10等</li>
|
|||
|
* <li>gecko系列会返回10900,158900等</li>
|
|||
|
* <li>webkit系列会返回其build号 (如 522等)</li>
|
|||
|
* </ul>
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* console.log( '当前浏览器版本号是: ' + UE.browser.version );
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.version = version
|
|||
|
|
|||
|
/**
|
|||
|
* @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容
|
|||
|
* @example
|
|||
|
* ```javascript
|
|||
|
* if ( UE.browser.isCompatible ) {
|
|||
|
* console.log( '浏览器与UEditor能够良好兼容' );
|
|||
|
* }
|
|||
|
* ```
|
|||
|
*/
|
|||
|
browser.isCompatible =
|
|||
|
!browser.mobile &&
|
|||
|
((browser.ie && version >= 6) ||
|
|||
|
(browser.gecko && version >= 10801) ||
|
|||
|
(browser.opera && version >= 9.5) ||
|
|||
|
(browser.air && version >= 1) ||
|
|||
|
(browser.webkit && version >= 522) ||
|
|||
|
false)
|
|||
|
return browser
|
|||
|
})())
|
|||
|
//快捷方式
|
|||
|
window.ie = window.browser.ie;
|
|||
|
window.webkit = window.browser.webkit;
|
|||
|
window.gecko = window.browser.gecko;
|
|||
|
window.opera = window.browser.opera;
|
|||
|
//log
|
|||
|
console.log("browser : ", window.browser,
|
|||
|
"\nie: ", window.ie,
|
|||
|
"\nwindow.webkit: ", window.webkit,
|
|||
|
"\nwindow.gecko: ", window.gecko,
|
|||
|
"\nwindow.opera: ", window.opera)
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @returns 生产uuid
|
|||
|
*/
|
|||
|
Uuid() {
|
|||
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
|
|||
|
.replace(/[xy]/g, function (c) {
|
|||
|
const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8)
|
|||
|
return v.toString(16)
|
|||
|
}).split("-")[0]
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 阻止默认事件
|
|||
|
* @constructor
|
|||
|
*/
|
|||
|
ProhibitDefaultEvent(event) {
|
|||
|
event.preventDefault()
|
|||
|
event.returnValue = false
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 获取 触发事件的元素
|
|||
|
* @param event
|
|||
|
* @constructor
|
|||
|
*/
|
|||
|
GetEventTarget(event) {
|
|||
|
return event.target
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ParseEvent(e) {
|
|||
|
return e || window.event //标准化事件处理
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
GetKeyCode(event) {
|
|||
|
return event.keyCode || event.which || event.charCode
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 当前选区。 兼容不同浏览器
|
|||
|
* @returns {Selection|*}
|
|||
|
*/
|
|||
|
GetSelection() {
|
|||
|
return window.getSelection() || document.selection
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 是否是数字
|
|||
|
* @param value
|
|||
|
* @returns {boolean}
|
|||
|
*/
|
|||
|
IsNum(value) {
|
|||
|
return !isNaN(parseFloat(value)) && isFinite(value)
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 在节点node后面插入新节点newNode
|
|||
|
* @method InsertAfter
|
|||
|
* @param { Node } node 目标节点
|
|||
|
* @param { Node } newNode 新插入的节点, 该节点将置于目标节点之后
|
|||
|
* @return { Node } 新插入的节点
|
|||
|
*/
|
|||
|
InsertAfter(node, newNode) {
|
|||
|
return node.nextSibling
|
|||
|
? node.parentNode.insertBefore(newNode, node.nextSibling)
|
|||
|
: node.parentNode.appendChild(newNode)
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 新增一个元素
|
|||
|
* @param newParagraph
|
|||
|
*/
|
|||
|
AddNewParagraph(newParagraph) {
|
|||
|
//docRoot
|
|||
|
window.myEdit.ctx.MyRoot.appendChild(newParagraph);
|
|||
|
|
|||
|
//mapRoot
|
|||
|
let myP = new MyDocItem(newParagraph);
|
|||
|
let curOrder = myP.parseOrder();
|
|||
|
let uuid = myP.parseUuid();
|
|||
|
window.myEdit.ctx.MyDocMap.set(curOrder, new MyMapItem(uuid))
|
|||
|
|
|||
|
//收起选区到一个点,光标落在一个可编辑元素上
|
|||
|
window.myEdit.utils.GetSelection().setPosition(newParagraph, 0);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 同步某一行数据到对应的 map节点
|
|||
|
* @param docP
|
|||
|
* @constructor
|
|||
|
*/
|
|||
|
SyncMapItemChildrenStyle(docP) {
|
|||
|
//子元素为空不处理
|
|||
|
let items = docP.childNodes;
|
|||
|
if (items.length <= 0) {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//构造参数
|
|||
|
let curMyP = new MyDocItem(docP);
|
|||
|
let mapItem = window.myEdit.ctx.getMapItem(curMyP.parseOrder());
|
|||
|
|
|||
|
//清空重置
|
|||
|
// console.log(mapItem);
|
|||
|
mapItem.getStyle().setChildrenStyleMapNull();
|
|||
|
//遍历
|
|||
|
for (let i = 0; i < items.length; i++) {
|
|||
|
let curItem = items[i];
|
|||
|
let tmpClassList = curItem.classList;
|
|||
|
if (tmpClassList != null && tmpClassList.length > 0) {
|
|||
|
mapItem.getStyle().setChildrenStyle(i, tmpClassList);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// console.log("sync docP : ", docP, " children: ", docP.children, " childrenMap: ", mapItem.getStyle().getChildrenStyleMap())
|
|||
|
}
|
|||
|
|
|||
|
}
|