0

뭐죠간의 차이 X = document.getElementById를 ("ID"). 클래스 명 = X = document.getElementById를 ("ID") = x.className

<div class="w3-dropdown-click"> 
    <button class="w3-btn" onclick="clickDrp()">Hover Over me</button> 
    <div class="w3-dropdown-content w3-animate-zoom w3-bar-block" id="cont">   
     <a href="#" class="w3-bar-item w3-button">SomeLink1</a> 
     <a href="#" class="w3-bar-item w3-button">SomeLink2</a> 
     <a href="#" class="w3-bar-item w3-button">SomeLink3</a> 
     <a href="#" class="w3-bar-item w3-button">SomeLink4</a> 
    </div> 
</div> 
<script type="text/javascript"> 
    function clickDrp(){ 
     var x = document.getElementById("cont").className; 
     if(x.search("w3-show") == -1) 
      x += " w3-show"; 
     else 
      x = x.replace(" w3-show",""); 
    } 
</script> 

다음 코드 차가
<div class="w3-dropdown-click"> 
    <button class="w3-btn" onclick="clickDrp()">Hover Over me</button> 
    <div class="w3-dropdown-content w3-animate-zoom w3-bar-block" id="cont">   
     <a href="#" class="w3-bar-item w3-button">SomeLink1</a> 
     <a href="#" class="w3-bar-item w3-button">SomeLink2</a> 
     <a href="#" class="w3-bar-item w3-button">SomeLink3</a> 
     <a href="#" class="w3-bar-item w3-button">SomeLink4</a> 
    </div> 
</div> 
<script type="text/javascript"> 
    function clickDrp(){ 
     var x = document.getElementById("cont"); 
     if(x.className.search("w3-show") == -1) 
      x.className += " w3-show"; 
     else 
      x.className = x.className.replace(" w3-show",""); 
    } 
</script> 

두 번째 드롭 다운 메뉴는 정상적으로 작동합니다. x가 글로벌 변수가 된 경우에도 처음에는 그렇지 않습니다.

저는 javascript에 익숙하지 않아 그 이유를 알 수 없습니다. 누군가 추론 할 수 있습니까?

PS : 나는 첫 번째 변형에서 W3-CSS를

답변

4

를 사용했습니다 당신의 변수 xclassName 문자열의 복사본입니다. x으로 변경하면 해당 변수가 변경되고 원래 className 속성 값은 변경되지 않습니다.

두 번째 변형에서 변수 xgetElementById이 반환하는 개체 참조의 복사본입니다. x에 새 값을 지정하지 않으면 DOM 객체를 가리 킵니다. x (즉, 해당 속성 중 하나에 할당 됨, 예 : className)으로 완료되면 DOM 객체에 영향을 미치므로 효과가 웹 문서에 표시됩니다.

+0

x가 전역 변수 인 경우 어떻게해야합니까 ?? –

+0

@PrajvalM은 차이가 없습니다. – Pointy

+0

@PrajvalM, 그건 부적절합니다. 문자열 값을 변수 (로컬, 전역 또는 일부 개체의 속성 - 중요하지 않음)에 할당하면 복사본을 할당하게됩니다. 문자열은 프리미티브 값입니다 (변경 불가능). 'className' 속성의 값을 변경하는 유일한 방법은 새로운 문자열을 할당하는 것입니다. 변수에 대입하여이 작업을 수행 할 수 없으면'className' 속성이 필요합니다. – trincot

0

질문이 올바르게 표시되지 않았습니다. 여기에 문제의 간단한 예입니다

x = document.getElementById(“id”); 
x.className = ...; 

x = document.getElementById(“id”).className; 
x = ...; 

사이의 차이는 다음과 같습니다

// Case 1 
var a = { foo: "bar" }; 
var b = a.foo; 
b += "baz"; 
console.log(a.foo); // "bar" 
console.log(b); // "barbaz" 

// Case 2 
var a = { foo: "bar" }; 
var b = a.foo; 
a.foo += "baz"; 
console.log(a.foo); // "barbaz" 
console.log(b); // "bar" 

할당 a.foo += "baz";가에, a.foo = a.foo + "baz";와 같은 의미, 또는 당신의 사례 :

x.className = x.className + " w3-show"; 

+= operator을 사용하여 새 문자열을 만든 다음 해당 문자열을 x.className에 할당했습니다. 이것은 x의 속성 "className"이 문자열 값 "bar"(more on object properties)에 대한 객체의 속성 맵에있는 키라는 사실에서 유래합니다.