2014-09-03 3 views
0

나는 캘린더 스크립트를 만들고 있는데 오페라 브라우저에서는 잘 작동하지만 파이어 폭스에서는 그렇지 않다. 문제는 당일 선택에서 발생합니다. 이 특정 스 니펫은 문제를 보여줍니다. 이 경우 dayofweek []에는 사람들이 클릭 할 수있는 고유 번호가 포함 된 31 개의 DIV 태그가 들어 있습니다.자바 스크립트 onclick 비정상적인 동작

<script type="text/javascript"> 
var maxdays=31; 
for (var n=1;n<=maxdays;n++){ 
dayofweek[n].onclick="selectday("+n+")"; 
} 

function selectday(day){alert(day+" is selected");} 
</script> 

이 스크립트는 올바른 번호가 선택되었다는 메시지를 인쇄하여 작동합니다 (오페라에서 작동). 파이어 폭스에서 onclick 이벤트 내가 클릭을 만들어도 그래도 실행되지 않습니다 .. 내가 노력

다른 방법이 있습니다 :

<script type="text/javascript"> 
var maxdays=31; 
for (var n=1;n<=maxdays;n++){ 
dayofweek[n].onclick=function(){selectday(n);} 
} 

function selectday(day){alert(day+" is selected");} 
</script> 

이 시간, 파이어 폭스와 오페라 응답,하지만 문제 모두는 "그 31 선택됨 "은 내가 선택한 번호와 상관없이 나타납니다.

누구든지 내가 할 수있는 모든 자바 스크립트 사용 인터넷 브라우저가 내 코드와 협조하도록 할 수 있는지 알고 있습니까?

답변

0

자바 스크립트는 블록 범위가 아닙니다. 이것을 시도하십시오 :

<script type="text/javascript"> 
var maxdays=31; 
for (var n=1;n<=maxdays;n++){ 
    dayofweek[n].onclick=selectdaywrapper(n); 
} 

function selectdaywrapper(day) { 
    function selectday(){ 
     alert(day+" is selected"); 
    } 
    return selectday; 
} 
</script> 

실행중인 문제는 범위 지정과 변수가 js에 바인딩되는 방법과 관련이 있습니다. 루프에서 생성하는 함수는 루프 변수에 바인딩되지만 루프가 완료 될 때까지 평가되지 않으므로 모든 onclick 이벤트가 최종 값 n으로 실행됩니다

+0

함수를 생각하지 않았습니다. 기능에서 그러나 그 아이디어는 작동하지 않는다. 내가 얻지 못하는 것은 하루가 아무 것도 알 수없는 것처럼 보일 때 알리 함수에서 값을 유지하는 방법입니다. –

+0

실제로 자바 스크립트 개발자가 처음으로 작성한 가장 일반적인 실수 중 하나입니다. (따라서 minitech는 질문을 표시했습니다. 중복으로). 트릭은 자바 스크립트에서 범위 지정과 클로저를 이해하는 것입니다. 다음은 문제에 대한 설명이 담긴 기사입니다. http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/#highlighter_546762 멋진 Google 기술 관련 이야기가 있었지만 더 이상 찾지 못한다. –