Код с classList не работает в IE?
Я использую следующий код, но он не в IE. Сообщение таково:
невозможно получить значение свойства 'add': object is null or undefined"
Я предполагаю, что это просто проблема поддержки IE. Как бы вы сделали следующий код работать в IE?
какие идеи?
var img = new Image();
img.src = '/image/file.png';
img.title = 'this is a title';
img.classList.add("profilePic");
var div = document.createElement("div");
div.classList.add("picWindow");
div.appendChild(img);
content.appendChild(div);
6 ответов:
The
classList
свойство не поддерживается IE9 и ниже. IE10+ поддерживает его, Хотя.
ИспользуйтеclassName += " .."
вместо. Примечание:не опускайте пробел: имена классов должны быть добавлены в список, разделенный пробелами.var img = new Image(); img.src = '/image/file.png'; img.title = 'this is a title'; img.className += " profilePic"; // Add profilePic class to the image var div = document.createElement("div"); div.className += " picWindow"; // Add picWindow class to the div div.appendChild(img); content.appendChild(div);
Как отметил одежду,
classList
не поддерживается IE9 и старше. Как и альтернатива Алекса выше, есть несколько полифиллов, которые стремятся быть заменой капли, т. е. просто включите их в свою страницу, и IE должен просто работать (знаменитые последние слова!).https://github.com/eligrey/classList.js/blob/master/classList.js
зацените
Object.defineProperty(Element.prototype, 'classList', { get: function() { var self = this, bValue = self.className.split(" ") bValue.add = function (){ var b; for(i in arguments){ b = true; for (var j = 0; j<bValue.length;j++) if (bValue[j] == arguments[i]){ b = false break } if(b) self.className += (self.className?" ":"")+arguments[i] } } bValue.remove = function(){ self.className = "" for(i in arguments) for (var j = 0; j<bValue.length;j++) if(bValue[j] != arguments[i]) self.className += (self.className?" " :"")+bValue[j] } bValue.toggle = function(x){ var b; if(x){ self.className = "" b = false; for (var j = 0; j<bValue.length;j++) if(bValue[j] != x){ self.className += (self.className?" " :"")+bValue[j] b = false } else b = true if(!b) self.className += (self.className?" ":"")+x } else throw new TypeError("Failed to execute 'toggle': 1 argument required") return !b; } return bValue; }, enumerable: false })
и classList будет работать!
document.getElementsByTagName("div")[0].classList ["aclass"] document.getElementsByTagName("div")[0].classList.add("myclass") document.getElementsByTagName("div")[0].className "aclass myclass"
вот и все!
/** * Method that checks whether cls is present in element object. * @param {Object} ele DOM element which needs to be checked * @param {Object} cls Classname is tested * @return {Boolean} True if cls is present, false otherwise. */ function hasClass(ele, cls) { return ele.getAttribute('class').indexOf(cls) > -1; } /** * Method that adds a class to given element. * @param {Object} ele DOM element where class needs to be added * @param {Object} cls Classname which is to be added * @return {null} nothing is returned. */ function addClass(ele, cls) { if (ele.classList) { ele.classList.add(cls); } else if (!hasClass(ele, cls)) { ele.setAttribute('class', ele.getAttribute('class') + ' ' + cls); } } /** * Method that does a check to ensure that class is removed from element. * @param {Object} ele DOM element where class needs to be removed * @param {Object} cls Classname which is to be removed * @return {null} Null nothing is returned. */ function removeClass(ele, cls) { if (ele.classList) { ele.classList.remove(cls); } else if (hasClass(ele, cls)) { ele.setAttribute('class', ele.getAttribute('class').replace(cls, ' ')); } }
classList
не поддерживается в IE jQuery.добавление или полифилл как одно на https://developer.mozilla.org/en-US/docs/Web/API/Element/classList
в IE 10 & 11 свойство classList определяется на HTMLElement.прототип.
чтобы заставить его работать на SVG-элементах, свойство должно быть определено на элементе.прототип, как и в других браузерах.
очень небольшое исправление будет копировать точный propertyDescriptor из HTMLElement.прототип к элементу.прототип:
if (!Object.getOwnPropertyDescriptor(Element.prototype,'classList')){ if (HTMLElement&&Object.getOwnPropertyDescriptor(HTMLElement.prototype,'classList')){ Object.defineProperty(Element.prototype,'classList',Object.getOwnPropertyDescriptor(HTMLElement.prototype,'classList')); } }
- нам нужно скопировать дескриптор, так как
Element.prototype.classList = HTMLElement.prototype.classList
броситInvalid calling object
- первый проверка предотвращает перезапись свойства в браузерах, которые поддерживают изначально.
- вторая проверка предотвращает ошибки в версиях IE до 9, где HTMLElement еще не реализован, и в IE9, где classList не реализован.
для IE 8 & 9, используйте следующий код, я также включил (уменьшенный) полифилл для массива.прототип.indexOf, потому что IE 8 не поддерживает его изначально (источник polyfill: массив.прототип.indexOf
//Polyfill Array.prototype.indexOf Array.prototype.indexOf||(Array.prototype.indexOf=function (value,startIndex){'use strict';if (this==null)throw new TypeError('array.prototype.indexOf called on null or undefined');var o=Object(this),l=o.length>>>0;if(l===0)return -1;var n=startIndex|0,k=Math.max(n>=0?n:l-Math.abs(n),0)-1;function sameOrNaN(a,b){return a===b||(typeof a==='number'&&typeof b==='number'&&isNaN(a)&&isNaN(b))}while(++k<l)if(k in o&&sameOrNaN(o[k],value))return k;return -1}); // adds classList support (as Array) to Element.prototype for IE8-9 Object.defineProperty(Element.prototype,'classList',{ get:function(){ var element=this,domTokenList=(element.getAttribute('class')||'').replace(/^\s+|\s$/g,'').split(/\s+/g); if (domTokenList[0]==='') domTokenList.splice(0,1); function setClass(){ if (domTokenList.length > 0) element.setAttribute('class', domTokenList.join(' '); else element.removeAttribute('class'); } domTokenList.toggle=function(className,force){ if (force!==undefined){ if (force) domTokenList.add(className); else domTokenList.remove(className); } else { if (domTokenList.indexOf(className)!==-1) domTokenList.splice(domTokenList.indexOf(className),1); else domTokenList.push(className); } setClass(); }; domTokenList.add=function(){ var args=[].slice.call(arguments) for (var i=0,l=args.length;i<l;i++){ if (domTokenList.indexOf(args[i])===-1) domTokenList.push(args[i]) }; setClass(); }; domTokenList.remove=function(){ var args=[].slice.call(arguments) for (var i=0,l=args.length;i<l;i++){ if (domTokenList.indexOf(args[i])!==-1) domTokenList.splice(domTokenList.indexOf(args[i]),1); }; setClass(); }; domTokenList.item=function(i){ return domTokenList[i]; }; domTokenList.contains=function(className){ return domTokenList.indexOf(className)!==-1; }; domTokenList.replace=function(oldClass,newClass){ if (domTokenList.indexOf(oldClass)!==-1) domTokenList.splice(domTokenList.indexOf(oldClass),1,newClass); setClass(); }; domTokenList.value = (element.getAttribute('class')||''); return domTokenList; } });