문제

이 작업을 수행하는 코드가 있습니다.

 var changes = document.getElementsByName(from);
 for (var c=0; c<changes.length; c++) {
   var ch = changes[c];
   var current = new String(ch.innerHTML);
   etc.
 }

FF와 Chrome에서는 제대로 작동하지만 IE7에서는 작동하지 않습니다.아마도 getElementsByName이 IE에서 작동하지 않기 때문일 것입니다.가장 좋은 해결 방법은 무엇입니까?

도움이 되었습니까?

해결책

이것이 왜 IE에서 작동하지 않는지 모르는 경우 여기에 있습니다. 해당 기능에 대한 MSDN 문서:

getElementsByName 메소드를 사용하면 지정된 이름 속성 또는 ID 속성 값이있는 문서의 모든 요소가 반환됩니다.

이름 속성과 ID 속성을 모두 지원하는 요소는 getElementsByName 메소드에 의해 리턴 된 컬렉션에 포함되지만 이름 Expando가있는 요소는 컬렉션에 포함되지 않습니다. 따라서이 메소드는 이름으로 사용자 정의 태그를 검색하는 데 사용할 수 없습니다.

Firefox가 허용합니다 getElementsByName() 이름 Expando를 사용하는 요소를 검색하려면 작동하는 이유입니다. 그것이 좋은 것인지 아닌지 ™는 논쟁의 여지가있을 수 있지만 그것이 현실입니다.

따라서 한 가지 옵션은 다음을 사용하는 것입니다 getAttribute() Dom Method는 이름 속성을 요청한 다음 값을 테스트하여 원하는지 확인하고 배열에 추가하십시오. 그러나이를 위해서는 페이지의 모든 노드 또는 최소한 하위 섹션 내에서 가장 효율적이지 않을 것입니다. 당신은 같은 것을 사용하여 그 목록을 미리 제한 할 수 있습니다. getElementsByTagName() 아마도.

이 작업을 수행하는 또 다른 방법은 페이지의 HTML을 제어 할 경우 관심있는 모든 요소에 숫자에 따라 변하는 ID를 제공하는 것입니다.

<div id="Change0">...</div>
<div id="Change1">...</div>
<div id="Change2">...</div>
<div id="Change3">...</div>

그런 다음 다음과 같은 JavaScript를 사용하십시오.

// assumes consecutive numbering, starting at 0
function getElementsByModifiedId(baseIdentifier) {
    var allWantedElements = [];
    var idMod = 0;
    while(document.getElementById(baseIdentifier + idMod)) { // will stop when it can't find any more
        allWantedElements.push(document.getElementById(baseIdentifier + idMod++));
    }
    return allWantedElements;
}

// call it like so:
var changes = getElementsByModifiedId("Change");

그것은 물론 해킹이지만, 필요한 일을하고 다른 해킹과 비교할 때 너무 비효율적이지는 않습니다.

어떤 종류의 JavaScript 프레임 워크/툴킷을 사용하는 경우 옵션이 훨씬 좋지만 사용 중이라고 표시하지 않으면 해당 세부 사항에 들어갈 시간이 없습니다. 개인적으로, 나는 사람들이 하나없이 어떻게 사는지 모르겠습니다. 그들은 당신이 감당할 수없는 많은 시간, 노력 및 좌절을 절약합니다. ~ 아니다 하나를 사용합니다.

다른 팁

몇 가지 문제가 있습니다.

  1. 즉, 실제로 혼란 스럽습니다 id="" ~와 함께 name=""
  2. name="" 허용되지 않습니다 <span>

고치려면 다음과 같이 제안합니다.

  1. 모든 것을 변경하십시오 name="" 에게 class=""
  2. 다음과 같이 코드를 변경하십시오.

-

var changes = document.getElementById('text').getElementsByTagName('span');
for (var c=0; c<changes.length; c++) {
 var ch = changes[c];

 if (ch.className != from)
continue;

 var current = new String(ch.innerHTML);

NAME 속성을 사용하여 요소를 찾는 것은 그리 일반적이지 않습니다.ID 속성으로 전환하는 것이 좋습니다.

그러나 jQuery를 사용하면 특정 이름을 가진 요소를 찾을 수 있습니다.

 $("*[name='whatevernameYouWant']");

그러면 주어진 이름을 가진 모든 요소가 반환됩니다.

getElementsByName은 IE에서 지원되지만 버그가 있습니다. 특히 'ID'가 주어진 값과 '이름'과 일치하는 요소를 반환합니다. 그래도 조금 더 컨텍스트, 코드 및 실제 오류 메시지가없는 문제인지 알 수 없습니다.

HTML의 '이름'속성에는 혼동 될 수있는 몇 가지 겹치는 목적을 가지고 있기 때문에 일반적으로 GetElementsByName은 피하는 것이 가장 좋습니다. getElementById를 사용하는 것이 훨씬 신뢰할 수 있습니다. 형태 필드로 구체적으로 작업 할 때는 양식 [이름]을보다 안정적으로 사용할 수 있으며 원하는 필드를 검색 할 수 있습니다.

나는 래퍼를 사용하여 요소의 배열을 반환하기 위해 성공했습니다. IE 6과 7에서도 작동합니다. NodeList가 아니기 때문에 Document.getEmentsByName과 똑같은 것은 100%가 아닙니다. 그러나 내가 필요로하는 것, 즉 Seting .disabled = true와 같은 간단한 일을하기 위해 다양한 요소에서 루프를 실행하는 것입니다.

이 함수는 여전히 getElementsByName을 사용하지만이 방법을 사용하면 작동합니다. 직접 참조하십시오.

function getElementsByNameWrapper(name) {
  a = new Array();

  for (var i = 0; i < document.getElementsByName(name).length; ++i) {
    a.push(document.getElementsByName(name)[i]);
  }

  return a;
}

해결 방법

                var listOfElements = document.getElementsByName('aName'); // Replace aName with the name you're looking for
            // IE hack, because it doesn't properly support getElementsByName
            if (listOfElements.length == 0) { // If IE, which hasn't returned any elements
                var listOfElements = [];
                var spanList = document.getElementsByTagName('*'); // If all the elements are the same type of tag, enter it here (e.g.: SPAN)
                for(var i = 0; i < spanList.length; i++) {
                    if(spanList[i].getAttribute('name') == 'aName') {
                        listOfElements.push(spanList[i]);
                    }
                }
            }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top