var client = function () {
var engine = {
ie: 0,
gecko: 0,
webkit: 0,
khtml: 0,
opera: 0,
ver: null
}
var browser = {
ie: 0,
firefox: 0,
safari: 0,
konq: 0,
opera: 0,
chrome: 0,
ver: null
}
var system = {
win: false,
mac: false,
x11: false,
iphone: false,
ipod: false,
ipad: false,
ios: false,
android: false,
nokiaN: false,
winMobile: false,
wii: false,
ps: false
}
var ua = navigator.userAgent;
* opera 5及更高版本中都有opera对象,用于保存浏览器相关的表示信息等 opera
* 7.6及更高版本中,需要调用version()方法以返回一个表示浏览器版本的字符串
*/
if (window.opera) {
engine.ver = browser.ver = window
.opera
.version();
engine.opera = browser.opera = parseFloat(engine.ver);
} else if (/AppleWebKit\/(\S+)/.test(ua)) {
engine.ver = RegExp["$1"];
engine.webkit = parseFloat(engine.ver);
if (/Chrome\/(\S+)/.test(ua)) {
* chrome版本号信息格式
* Mozilla/5.0 (平台;加密类型;操作系统或CPU;语言)
* AppleWebKit/AppleWebKit版本号 (KHTML, like Gecko) Chrome/Chrome版本号 Safari/Safari版本
* 实例:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
*/
browser.ver = RegExp["$1"];
browser.chrome = parseFloat(browser.ver);
} else if (/Version\/(\S+)/.test(ua)) {
* safari版本号信息格式(3及以后)
* Mozilla/5.0 (平台;加密类型;操作系统或CPU;语言)
* AppleWebKit/AppleWebKit版本号 (KHTML, like Gecko) Version/Safari实际版本号 Safari/Safari版本号
* 实例:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4
*/
browser.ver = RegExp["$1"];
browser.safari = parseFloat(browser.ver);
} else {
var safariVersion = 1;
if (engine.webkit < 100) {
safariVersion = 1;
} else if (engine.webkit < 312) {
safariVersion = 1.2;
} else if (engine.webkit < 412) {
safariVersion = 1.3;
} else {
safariVersion = 2;
}
browser.safari = browser.ver = safariVersion;
}
} else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
* Konqueror版本信息格式
* Mozilla/5.0 (compatible; Konqueror/版本号;操作系统或CPU)
* konqueror 3.2之后
* Mozilla/5.0 (compatible; Konqueror/版本号;操作系统或CPU) KHTML/KHTML 版 本号 (like Gecko)
*/
engine.ver = browser.ver = RegExp["$1"];
engine.khtml = browser.konq = parseFloat(engine.ver);
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
* Gecko版本信息格式
* Mozilla/Mozilla版本号 (平台;加密类型;操作系统或CPU;语言;预先发行版本)
* Gecko/Gecko版本号 应用程序或产品/应用程序或产品版本号
* 实例(火狐):Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:47.0) Gecko/20100101 Firefox/47.0
*/
engine.ver = RegExp["$1"];
engine.gecko = parseFloat(engine.ver);
if (/Firefox\/(\S+)/.test(ua)) {
browser.ver = RegExp["$1"];
browser.firefox = parseFloat(browser.ver);
}
} else if (/MSIE ([^;]+)/.test(ua)) {
engine.ver = browser.ver = RegExp["$ 1"];
engine.ie = browser.ie = parseFloat(engine.ver);
}
browser.ie = engine.ie;
browser.opera = engine.opera;
var p = navigator.platform;
system.win = p.indexOf('Win') == 0;
system.mac = p.indexOf('Mac') == 0;
system.x11 = (p == "X11") || (p.indexOf("Linux") == 0);
if (system.win) {
* 匹配Windows95和Windows98这两个字符串。对这两个字符串,只有Gecko与其他浏览器不同,
* 即没有"dows",而且"Win"与版本号之间没有空格 <- Win95和Win98
* Gecko在表示Windows NT时会在末尾添加"4.0",因此在最后匹配一下小数
*/
if (/Win(?:dows )?([^do]{2}) \s?(\d+\.\d+)?/.test(ua)) {
if (RegExp["$1"] === "NT") {
switch (RegExp["$2"]) {
case "5.0":
system.win = "2000";
break;
case "5.1":
system.win = "XP";
break;
case "6.0":
system.win = "Vista";
break;
case "6.1":
system.win = "7";
break;
default:
system.win = "NT";
break;
}
} else if (RegExp["$1"] === "9x") {
system.win = "ME";
} else {
system.win = RegExp["$1"];
}
}
}
system.iphone = ua.indexOf("iPhone") > -1;
system.ipad = ua.indexOf("iPad") > -1;
system.ipod = ua.indexOf("iPod") > -1;
system.nokiaN = ua.indexOf("NokiaN") > -1;
if (system.win === "CE") {
system.winMobile = system.win;
} else if (system.win === "Ph") {
if (/Windows Phone OS (\d+.\d+)/.test(ua)) {
system.win = "Phone";
system.winMobile = parseFloat(RegExp["$1"]);
}
}
if (system.mac && ua.indexOf("Mobile") > -1) {
if (/CPU (?:iPhone)?OS (\d+_\d+)/.test(ua)) {
system.ios = parseFloat(RegExp["$1"].replace("_", "."));
} else {
system.ios = 2;
}
}
if (/Android (\d+\.\d+)/.test(ua)) {
system.android = parseFloat(RegExp["$1"]);
}
system.wii = ua.indexOf("Wii") > -1;
system.ps = /playstation/i.test(ua);
return {engine, browser, system};
}()
function convertToArray(nodes) {
var array = null;
try {
array = []
.slice
.call(nodes, 0);
} catch (ex) {
array = [];
for (var i = 0; i < nodes.length; i++) {
array.push(nodes[i]);
}
}
return array;
}
function outputAttributes(element) {
var pairs = [],
attrName,
attrValue,
i,
len;
for (i = 0, len = element.attributes.length; i < len; i++) {
attrName = element.attributes[i].nodeName;
attrValue = element.attributes[i].nodeValue;
if (element.attributes[i].specified) {
pairs.push(`${attrName}=${attrValue}`);
}
}
return pairs.join(" ");
}
function loadScript(url) {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
document
.body
.appendChild(script);
}
function loadStyles(url) {
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = url;
var head = document.getElementsByTagName("head")[0];
head.appendChild(link);
}
function loadStyleString(css) {
var style = document.createElement("style");
style.type = "text/css";
try {
style.appendChild(document.createTextNode(css));
} catch (ex) {
style.styleSheet.cssText = css;
}
var head = document.getElementsByTagName("head")[0];
head.appendChild(style);
}
function matchesSelector(el, selector) {
if (el.matchesSelector) {
return el.matchesSelector(selector);
} else if (el.msMatchesSelector) {
return el.msMatchesSelector(selector);
} else if (el.mozMatchesSelector) {
return el.mozMatchesSelector(selector);
} else if (el.webkitMatchesSelector) {
return el.webkitMatchesSelector(selector);
} else {
throw Error('Not Support!');
}
}
function contains(refNode, otherNode) {
if (typeof refNode.contains === "function") {
return refNode.contains(otherNode);
} else if (typeof refNode.compareDocumentPosition === "function") {
return !!(refNode.compareDocumentPosition & 16);
} else {
var node = otherNode.parentNode;
while (node !== null) {
if (node === refNode) {
return true;
} else {
node = node.parentNode;
}
}
return false;
}
}
function getStyleSheet(el) {
return el.sheet || el.styleSheet;
}
function insertRule(sheet, selectorText, cssText, position) {
if (sheet.insertRule) {
sheet.insertRule(selectorText + "(" + cssText + ")", position);
} else if (sheet.addRule) {
sheet.addRule(selectorText, cssText, position);
}
}
function deleteRule(sheet, index) {
if (sheet.deleteRule) {
sheet.deleteRule(index);
} else if (sheet.removeRule) {
sheet.removeRule(index);
}
}
function getElementLeft(el) {
var actualLeft = el.offsetLeft;
var current = el.offsetParent;
while (current !== null) {
actualLeft += current.offsetLeft;
current = current.offsetParent;
}
return actualLeft;
}
function getElementTop(el) {
var actualTop = el.offsetTop;
var current = el.offsetParent;
while (current !== null) {
actualTop += current.offsetTop;
current = current.offsetParent;
}
return actualTop;
}
function getViewport() {
if (document.compatMode === "BackCompat") {
return {width: document.body.clientWidth, height: document.body.clientHeight}
} else {
return {width: document.documentElement.clientWidth, height: document.documentElement.clientHeight}
}
}
function getBoundingClientRect(element) {
var scrollTop = document.body.scrollTop;
var scrollLeft = document.body.scrollLeft;
if (element.getBoundingClientRect) {
if (typeof arguments.callee.offset !== "number") {
var temp = document.createElement("div");
temp.style.cssText = "position:absolute;left:0;top:0;";
document
.body
.appendChild(temp);
arguments.callee.offset = -temp
.getBoundingClientRect()
.top - scrollTop;
document
.body
.removeChild(temp);
temp = null;
}
var rect = element.getBoundingClientRect();
var offset = arguments.callee.offset;
return {
left: rect.left + offset,
right: rect.right + offset,
top: rect.top + offset,
bottom: rect.bottom + offset
}
} else {
var actualTop = getElementTop(element);
var actualLeft = getElementLeft(element);
return {
left: actualLeft - scrollLeft,
right: actualLeft + element.offsetWidth - scrollLeft,
top: actualTop - scrollTop,
bottom: actualTop + element.offsetHeight - scrollTop
}
}
}
var EventUtil = {
addHandler(element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else {
element["on" + type] = handler;
}
},
removeHandler(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler)
} else {
element["on" + type] = null;
}
},
getEvent(e) {
return e || window.event;
},
getTarget(e) {
return e.target || e.srcElement;
},
preventDefault(e) {
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
},
stopPropagation(e) {
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
},
getRelatedTarget(e) {
if (e.relatedTarget) {
return e.relatedTarget;
} else if (e.toElement) {
return e.toElement;
} else if (e.fromElement) {
return e.fromElement;
} else {
return null;
}
},
getButton(e) {
if (document.implementation.hasFeature("MouseEvents", "2,0")) {
return e.button;
} else {
switch (e.button) {
case 0:
case 1:
case 3:
case 5:
case 7:
return 0;
break;
case 2:
case 6:
return 2;
break;
case 4:
return 1;
break;
}
}
},
getWheelDelta(e) {
if (e.wheelDelta) {
return (client.engine.opera && client.engine.opera < 9.5)
? -e.wheelDelta
: e.wheelDelta;
} else {
return -e.detail * 40
}
},
getCharCode(e) {
if (typeof e.charCode === "number") {
return e.charCode
} else {
return e.keyCode
}
},
getKey(e) {
return e.key || e.char || e.keyIdentifier
},
getLocation(e) {
return e.location || e.keyLocation;
},
getClipboardText(e) {
var clipboardData = (e.clipboardData || window.clipboardData);
return clipboardData.getData("text");
},
setClipboardText(e, value) {
if (e.clipboardData) {
return e
.clipboardData
.setData("text/plain", value);
} else if (window.clipboardData) {
return window
.clipboardData
.setData("text", value);
}
}
}
function getSelectedText(textbox) {
if (typeof textbox.selectionStart === "number") {
return textbox
.value
.substring(textbox.selectionStart, textbox.selectionEnd);
} else if (document.selection) {
return document
.selection
.createRange()
.text;
}
}
function selectText(textbox, startIndex, stopIndex) {
if (textbox.setSelectionRange) {
textbox.setSelectionRange(startIndex, stopIndex);
} else if (textbox.createTextRange) {
var range = textbox.createTextRange();
range.collapse(true);
range.moveStart("character", startIndex);
range.moveEnd("character", stopIndex - startIndex);
range.select();
}
textbox.focus();
}
function getSelectedOptions(selectbox) {
var result = [];
var option = null;
for (var i = 0, len = selectbox.options.length; i < len; i++) {
option = selectbox.options[i];
if (option.selected) {
result.push(option);
}
}
return result;
}