다음 코드를 사용하고 있지만 IE에서 실패합니다. 메시지는 다음과 같습니다.
속성 ‘add’의 값을 가져올 수 없습니다. 개체가 null이거나 정의되지 않았습니다. “
나는 이것이 단지 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
속성은 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);
답변
othes에서 언급했듯이 classList
IE9 및 이전 버전에서는 지원되지 않습니다. 위의 Alex의 대안과 마찬가지로 드롭 인 교체를 목표로하는 두 개의 polyfill이 있습니다.
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, ' '));
}
}
답변
이것 좀 봐
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"
그게 다야!
답변
IE 10 및 11에서 classList 속성은 HTMLElement.prototype에 정의되어 있습니다.
SVG 요소에서 작동하게하려면 속성이 다른 브라우저 에서처럼 Element.prototype에 정의되어야합니다.
아주 작은 수정은 HTMLElement.prototype에서 Element.prototype으로 정확한 propertyDescriptor를 복사하는 것입니다.
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
- 첫 번째 확인은 기본적으로 지원되는 브라우저에서 속성을 덮어 쓰는 것을 방지합니다.
- 두 번째 검사는 HTMLElement가 아직 구현되지 않은 9 이전 IE 버전과 classList가 구현되지 않은 IE9에서 오류를 방지하는 것입니다.
IE 8 및 9의 경우 다음 코드를 사용하고, IE 8에서 기본적으로 지원하지 않기 때문에 Array.prototype.indexOf에 대한 (축소 된) 폴리 필도 포함했습니다 (폴리 필 소스 : 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;
}
});
답변
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에 있는 것과 같은 polyfill을 사용 하십시오.