Я использую следующий код, но в IE он не работает. Это сообщение:
Невозможно получить значение свойства 'добавить': объект равен нулю или не определен "
Я предполагаю, что это просто проблема поддержки 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);
classList
несколько полифилов для .querySelector
должна бытьclassList
. Во-вторых,.remove
метод содержит ненужное RegExp, использование которого, как вы уже признали, приводит к ошибке. Поскольку у вас уже есть предварительные и суффиксные пробелы, достаточно простого.replace(' ' + className + ' ', ' ')
(кроме того, замечание «Допустимое имя класса не должно содержать никаких специальных символов регулярного выражения.» Неверно, см. Спецификацию (также верно для HTML4))Ответы:
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);
источник
className
Атрибут существует всегда. Он инициализируется пустой строкой. Для упрощения обслуживания кода+=
рекомендуется использовать для добавления имен классов.className
свойство элемента DOM - чтение-запись.Как упоминалось другими,
classList
не поддерживается IE9 и старше. Помимо альтернативы Алекса, приведенной выше, есть пара полифилов, которые предназначены для замены, то есть просто добавьте их на свою страницу, и IE должен просто работать (известные последние слова!).https://github.com/eligrey/classList.js/blob/master/classList.js
https://gist.github.com/devongovett/1381839
источник
/** * 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, ' ')); } }
источник
ele.getAttribute('class')
в некоторых случаях я возвращал null (может быть, если атрибут class еще не установлен?) - простая инструкция if решила эту проблему.В IE 10 и 11 свойство classList определено в HTMLElement.prototype.
Чтобы заставить его работать с SVG-элементами, свойство должно быть определено в Element.prototype, как это было в других браузерах.
Очень маленьким исправлением было бы копирование точного объекта propertyDescriptor из HTMLElement.prototype в Element.prototype:
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 8 и 9 используйте следующий код, я также включил (уменьшенный) полифилл для Array.prototype.indexOf, потому что IE 8 не поддерживает его изначально (источник полифила : Array.prototype.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; } });
источник
)
.Проверь это
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"
это все!
источник
В Explorer 11 classList.add работает только с отдельными значениями.
Element.classList.add("classOne", "classTwo");
В этом случае Explorer добавляет только первый класс и игнорирует второй. Итак, нужно сделать:
Element.classList.add("classOne"); Element.classList.add("classTwo");
источник
classList
не поддерживается в IE <9. Используйте jQuery.addClass или полифилл, подобный тому, который находится на https://developer.mozilla.org/en-US/docs/Web/API/Element/classListисточник
classList