- 2
- Hanam09
- 조회 수 856
<div id="Error"> <div hc-element="block"></div> <img width="150px" hc-float="center" src="img/Warning.svg.png"> <center> <h2>Oops, Access to this page has been denied!</h2> <button hc-event="back" hc-float="center">back</button> </center> <div hc-element="block"></div> </div>
문제가 되는 웹: gift.ihnkyou.gq
소스보기: view-source:gift.ihnkyou.gq
해당파일 : htmlctr.js
버튼이 작동하지 않습니다. 문제가 있는거 같은데 찾지는 못하겠습니다.
무엇이 문제인지 알려주실 수 있습니까?
저기 위에건 html 소스라서 못읽습니다.
이 문제를 해결하기 위하여 제가 어떻게 하여야 할까요?
Inv['plugin']['event'] 에 정의된 함수에 문제가 있습니다.
for(var i = 0; i < Inv.getElements('event').length; i++){
Inv.getElements('event')[i].onclick = function() {
if(Inv.getValue("event", i) === "refresh")
location.reload();
}
}
여기서 Element.onclick 함수 안에서 i 변수를 사용하셨는데,
반복문에서 사용되는 반복카운터는 함수 안에서 사용하시면 안됩니다.
저 i 값은 클로져 변수라 for 블럭 안에서만 사용되는 것은 맞으나, 그것이 반복할 때마다 새롭게 생성되는건 아닙니다.
이전에 실행되었던 반복코드에서도 i 값에 접근한다면, 돌아오는 값은 지금까지 진행된 카운트 수가 됩니다.
예를 들어, for(i = 0 to 10) { setTimeout( { alert(i) }, 1000); } 이라는 의사코드를 실행한다면,
출력되는 값은 어지간한 조선컴퓨터가 아닌 이상 10 이라는 숫자가 10회 출력된다는 것이죠.
하남님이 원하시는(또는 그렇게 추정되는) 방식으로 구현하려면,
저 i 값을 보존하는 변수를 하나 더 만들어서, 그 변수를 i 대신 사용해야겠죠.
for(var i = 0; i < Inv.getElements('event').length; i++){
var ti = i;
Inv.getElements('event')[ti].onclick = function() {
if(Inv.getValue("event", ti) === "refresh")
location.reload();
}
}
같은 느낌으로요.
솔직히, 제가 생각하기에는 그리 이상적인 방법은 아니라고 생각합니다.
요즘 PC에서는 웬만해선 부담되지 않겠지만, 그래도 많은 Element 들이 생긴다면, 부담이 될겁니다.
해당 Attribute 가 있는 개수만큼 변수를 생성해버릴테니까요.
저라면 getValue 에서 사용 가능한 파라미터 종류를 하나 더 만들듯 싶네요.
파라미터의 타입이 Element 라면, getElement를 거치지 않고, 바로 파라미터에서 Attribute를 가져오는 식으로요.