最近开发遇到IE8和IE9中classList的兼容性问题,在网上查找后发现许多解决方案都存在一定的小问题,现贴出正确的解决方案:
这是网上找到的解决方案:
if (!("classList" in document.documentElement)) {
Object.defineProperty(HTMLElement.prototype, 'classList', {
get: function() {
var self = this;
function update(fn) {
return function(value) {
var classes = self.className.split(/\s+/g),
index = classes.indexOf(value);
fn(classes, index, value);
self.className = classes.join(" ");
}
}
return {
add: update(function(classes, index, value) {
if (!~index) classes.push(value);
}),
remove: update(function(classes, index) {
if (~index) classes.splice(index, 1);
}),
toggle: update(function(classes, index, value) {
if (~index)
classes.splice(index, 1);
else
classes.push(value);
}),
contains: function(value) {
return !!~self.className.split(/\s+/g).indexOf(value);
},
item: function(i) {
return self.className.split(/\s+/g)[i] || null;
}
};
}
});
}主要存在以下问题:
1,第二行中 Object.defineProperty(HTMLElement.prototype, 'classList',
HTMLElement在IE8中不兼容,故替换为window.Element
2,indexOf在IE8中不兼容,需要自己实现该方法,因本项目中使用到jQuery,故使用jQuery中的inArray(value,arr)方法。
自己实现如下,就是在调用indexOf前判断下:
//添加数组IndexOf方法
if (!Array.prototype.indexOf){
Array.prototype.indexOf = function(elt /*, from*/){
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++){
if (from in this && this[from] === elt)
return from;
}
return -1;
};
}3,因Object.defineProperty()方法是IE8之后才有的,故此方法只适用IE8及以上,IE8以下的兼容需另外处理。
优化后完整版代码如下,使用前引入即可:
if (!("classList" in document.documentElement)) {
Object.defineProperty(window.Element.prototype, 'classList', {
get: function() {
var self = this;
function update(fn) {
return function(value) {
var classes = self.className.split(/\s+/g),
//index = classes.indexOf(value);
index = jQuery.inArray(value,classes);
fn(classes, index, value);
self.className = classes.join(" ");
}
}
return {
add: update(function(classes, index, value) {
if (!~index) classes.push(value);
}),
remove: update(function(classes, index) {
if (~index) classes.splice(index, 1);
}),
toggle: update(function(classes, index, value) {
if (~index)
classes.splice(index, 1);
else
classes.push(value);
}),
contains: function(value) {
//return !!~self.className.split(/\s+/g).indexOf(value);
return !!~jQuery.inArray(value,self.className.split(/\s+/g));
},
item: function(i) {
return self.className.split(/\s+/g)[i] || null;
}
};
}
});
}
版权声明:本文为qq_41807645原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。