-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path兼容处理技巧.js
195 lines (174 loc) · 5.55 KB
/
兼容处理技巧.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/* 通用的事件侦听器函数, 兼容 IE 与标准浏览器
*/
Event = {
// 页面加载完成后
readyEvent : function(fn) {
if (fn==null) {
fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
} else {
window.onload = function() {
oldonload();
fn();
};
}
},
// 视能力分别使用dom0||dom2||IE方式 来绑定事件
// 参数: 操作的元素,事件名称 ,事件处理程序
addEvent : function(element, type, handler) {
if (element.addEventListener) {
//事件类型、需要执行的函数、是否捕捉
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
} else {
element['on' + type] = handler;
}
},
// 移除事件
removeEvent : function(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.datachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
stopPropagation : function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 取消事件的默认行为
preventDefault : function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 获取事件目标
getTarget : function(event) {
return event.target || event.srcElement;
},
// 获取event对象的引用,取到事件的所有信息,确保随时能使用event;
getEvent : function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while (c) {
ev = c.arguments[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
return ev;
}
};
/* 在老版本浏览器中兼容 `bind()` 函数 */
if(!Function.prototype.bind) {
Function.prototype.bind = function(obj) {
var slice=[].slice,
args=slice.call(arguments,1),
self=this,
nop=function(){},
bound=function(){
return self.apply(this instanceof nop ? this : (obj || {}),
args.concat(slice.call(arguments)));
};
nop.prototype=self.prototype;
bound.prototype=new nop();
return bound;
};
}
/* 使用 `js`获取兼容可用的 样式属性名 */
const getsuitablePropertyName = (name) => {
let allPrefix = ['', '-webkit-', '-o-', '-ms-']
let len = allPrefix.length
let allStyle = document.body.style
for (let i = 0; i < len; i++) {
if (allPrefix[i] + name in allStyle) {
return allPrefix[i] + name
}
}
return null
}
// 用法示例
let suitTransform = getsuitablePropertyName('transform')
console.log(suitTransform)
// -> transform
/* 使用 `js` 获取 `translate`的浏览器合适写法 */
const getTranslate = () => {
let allPrefix = ['', '-webkit-', '-o-', '-ms-']
let len = allPrefix.length
let ele = document.createElement('div')
let eleTransform = getsuitablePropertyName('transform')
let realTranslate = null
for (let i = 0; i < len; i++) {
realTranslate = `${allPrefix[i]}translate(0px, 0px)`
ele.style[eleTransform] = realTranslate
if (ele.style[eleTransform] === realTranslate) {
return `${allPrefix[i]}translate`
}
}
return null
}
/* 使用 `js` 获取 `transitionend`的浏览器合适写法 */
const getTransitionend = () => {
let allOptions = ['ontransitionend', 'onWebkitTransitionEnd', 'onMozTransitionEnd', 'onOTransitionEnd']
let len = allOptions.length
for (let i = 0; i < len; i++) {
if (allOptions[i] in window) {
return allOptions[i]
}
}
return null
}
// 事件的判断属性名称,与真实使用的时候的名称不一定是一样的,所以使用的时候,还要需要稍微处理一下:
let suitTransitionend = () => {
let suitTransitionend = getTransitionend()
if (suitTransitionend === 'ontransitionend') {
suitTransitionend = 'transitionend'
} else {
suitTransitionend = suitTransitionend.slice(2, 3).toLowerCase() + suitTransitionend.slice(3)
}
return suitTransitionend
}
let suitTransitionend = setTransitionend()
document.body.addEventListener(suitTransitionend, ()=>{
// ...
})
/* 页面链接跳转历史 `URL`不记录的兼容处理 */
// 同一个页面中链接的点击不记录 `history`
// 摘自 [张鑫旭](http://www.zhangxinxu.com/wordpress/2017/02/page-link-url-history-null-not-record/)
var fnUrlReplace = function(eleLink) {
if(!eleLink) return
var href = eleLink.href
if(href && /^#|javascript/.test(href) === false) {
if(history.replaceState()) {
history.replaceState(null, document.title, href.split('#')[0] + '#')
location.replace('')
} else {
location.replace(href)
}
}
}
// 使用如下
document.querySelector('a').onclick = function(event) {
if(event && event.preventDefault) {
event.preventDefault()
}
fnUrlReplace(this)
return false
}