2010-12-09 4 views
5

IE에서 getElementsByClassName 문제를 해결하는 방법을 알아내는 데 문제가 있습니다. 로버트 네이먼을 구현하는 가장 좋은 방법은 (내 담당자가 1 인 이래로 링크를 게시 할 수 없음) 내 코드에 어떻게 적용할까요? 아니면 jquery 해상도가 더 좋을까요? 내 코드는getElementsByClassName IE 해상도 문제

function showDesc(name) { 
var e = document.getElementById(name); 
//Get a list of elements that have a class name of service selected 
var list = document.getElementsByClassName("description show"); 

//Loop through those items 
for (var i = 0; i < list.length; ++i) { 
    //Reset all class names to description 
    list[i].className = "description"; 
} 

if (e.className == "description"){ 
    //Set the css class for the clicked element 
    e.className += " show"; 
} 
else{ 
    if (e.className == "description show"){ 
     return; 
    } 
}} 

내가 표시/각 서비스 (크롬과 FF에서 작동)에 대한 설명을 숨기려면이 페이지 dev.msmnet.com/services/practice-management에 사용하고 있습니다. 모든 팁은 크게 감사하겠습니다.

+1

JQuery와 솔루션은 참으로 * 방법 * 쉽게 –

+0

사용 jQuery를 ... 또는 당신을 위해 크로스 브라우저 물건을 처리합니다 다른 프레임 워크가 될 것입니다. 바퀴를 재발 명하지 마십시오. – Lee

답변

2

나는 함수의 jQuery를 버전은 다음과 같은 형태가 될 것이다 궁금했다, 그래서 나는이 함께했다 :

function showDesc(name) { 
    var e = $("#" + name); 
    $(".description.show").removeClass("show"); 
    if(e.attr("class") == "description") { 
     e.addClass("show"); 
    } else if(e.hasClass("description") && e.hasClass("show")) { 
     return; 
    } 
} 
+0

완벽하게 작동합니다! 그리고 만약 내가 올바른지 getElementsByTagName ("*")을 사용하는 것보다 훨씬 효율적입니다. –

+0

효율적으로 원한다면'show' 클래스를 포기하고 jQuery를 사용하여 표시하거나 숨길 수 있습니다. 아래 내 대답을 참조하십시오. –

0

다음과 getElementsByClassName()을 대체 할 수

function getbyclass(n){ 
    var elements = document.getElementsByTagName("*"); 
    var result = []; 
    for(z=0;z<elements.length;z++){ 
    if(elements[z].getAttribute("class") == n){ 
     result.push(elements[z]); 
    } 
    } 
    return result; 
} 

그런 다음이처럼 사용할 수 있습니다

getbyclass("description") // Instead of document.getElementsByClassName("description") 
+0

또한 여러 클래스 문자열을 포함하는 클래스 속성을 처리해야합니다. – casablanca

+0

문서에 요소가 두 개 이상 있거나 함수를 몇 번 이상 호출하면 비효율적 인 것처럼 보입니다. – Lee

+0

사실,'getbyclass ("one two")를 썼다면, 하나와 둘을 가진 것들을 가져와야한다. OP가 필요한 경우, 나는 그것을 위해 100 % tho – JCOC611

2

이 여러 클래스를 지원해야한다.

function getElementsByClassName(findClass, parent) { 

    parent = parent || document; 
    var elements = parent.getElementsByTagName('*'); 
    var matching = []; 

    for(var i = 0, elementsLength = elements.length; i < elementsLength; i++){ 

    if ((' ' + elements[i].className + ' ').indexOf(findClass) > -1) { 
     matching.push(elements[i]); 
    } 

    } 

    return matching; 

} 

DOM을 좀 더 빠르게 검색 할 수 있도록 부모도 전달할 수 있습니다.

당신이 다음 HTML <div class="a b c" /> 일치과 같이 그것을 변화 시도 getElementsByClassName('a c')를 원한다면 ...

var elementClasses = elements[i].className.split(/\s+/), 
    matchClasses = findClass.split(/\s+/), // Do this out of the loop :) 
    found = 0; 

for (var j = 0, elementClassesLength = elementClasses.length; j < elementClassesLength; j++) { 

    if (matchClasses.indexOf(elementClasses[j]) > -1) { 
     found++; 
    } 

} 

if (found == matchClasses.length) { 
    // Push onto matching array 
} 

경우에만이 기능은 이미 존재하지 않을 경우 사용할 수 원하는 경우,

와 정의를 포장
if (typeof document.getElementsByClassName != 'function') { } 
1

더 쉬운 jQuery를 솔루션 : 당신이 jQuery를 사용하는 경우

$('.service').click(function() { 
    var id = "#" + $(this).attr('id') + 'rt'; 
    $('.description').not(id).hide(); 
    $(id).show(); 
} 

show 클래스와 귀찮게?

1

HTMLElement.getElementByClassName()을 구현하는 데 사용했지만 적어도 Firefox와 Chrome에서는 요소가 많을 때 요소의 절반 만 찾았습니다. 대신 실제로는 더 큰 함수입니다.

getElmByClass(clm, parent){ 
    // clm: Array of classes 
    if(typeof clm == "string"){ clm = [clm] } 
    var i, m = [], bcl, re, rm; 
    if (document.evaluate) { // Non MSIE browsers 
     v = ""; 
     for(i=0; i < clm.length; i++){ 
     v += "[contains(concat(' ', @"+clc+", ' '), ' " + base[i] + " ')]"; 
     } 
     c = document.evaluate("./"+"/"+"*" + v, parent, null, 5, null); 
     while ((node = c.iterateNext())) { 
      m.push(node); 
     } 
    }else{     // MSIE which doesn't understand XPATH 
     v = elm.getElementsByTagName('*'); 
     bcl = ""; 
     for(i=0; i < clm.length; i++){ 
      bcl += (i)? "|":""; 
      bcl += "\\b"+clm[i]+"\\b"; 
     } 
     re = new RegExp(bcl, "gi"); 
     for(i = 0; i < v.length; i++){ 
     if(v.className){ 
      rm = v[i].className.match(bcl); 
      if(rm && rm.length){  // sometimes .match returns an empty array so you cannot use just 'if(rm)' 
       m.push(v[i]) 
      } 
     } 
     } 
    } 
    return m; 
} 

나는 정규식은 (.indexOf와 아마 함수는 테스트 shuld) 느린이기 때문에, XPATH없이 반복하는 빠른 방법이있을 거라고 생각하지만, 잘

1

내가 넣어 Heres는 하나 노력하고 있습니다 함께, 믿을만하고 아마도 가장 빠릅니다. 어떤 상황에서도 작동해야합니다.

function $class(className) { 
    var children = document.getElementsByTagName('*') || document.all; 
    var i = children.length, e = []; 
    while (i--) { 
     var classNames = children[i].className.split(' '); 
     var j = classNames.length; 
     while (j--) { 
      if (classNames[j] == className) { 
       e.push(children[i]); 
       break; 
      } 
     } 
    } 
    return e; 
}