2012-06-04 4 views
3

인라인이 아니지만 YUI 라이브러리의 대화 상자가 강제로 알 수 있습니다. 내 문제는이 div 위로 마우스를 가져갈 때마다 여백 왼쪽 스크롤이 활성화되지만 div에서 마우스를 움직일 때 멈추지 않는다는 것입니다.clearInterval() setInterval() 사용 후 정의되지 않은 오류

<div class="span1" onmouseover=" 
      var timerID; 
      $(document).ready(function(){    
        timerID = setInterval(scrollLeft, 10); 

        function scrollLeft(){ 
         $('.inner_wrapper').animate({ 
          marginLeft: '-=30px' 
         }); 
        } 
      }); 
      " onmouseout="clearInterval(timerID)"> 
     </div> 

편집 :

Uncaught ReferenceError: timerID is not defined

그리고 여기에 코드의 다음 JS 콘솔보고 것은 내가 대화 상자 내부의 SCRIPT 태그를 실행할 수 있다는 것입니다 (그들은 이미 스크립트를 통해 생성되는 필터 어떤 onmouseover 및 onmouseout과 같은 인라인 외에도 자바 스크립트). 따라서 onmouseover 및 onmouseout 핸들을 단일 함수로 캡슐화하라는 제안은이 경우 작동하지 않습니다.

+0

하여 setInterval ("scrollLeft에()", 10) 건 내가, 외부 자바 스크립트를 실행하는 자신의 스크립트 태그 또는 그것을 할 수 없다는 것입니다 –

답변

4

범위 문제입니다. 변수 timerID은 onmouseout에서 볼 수 없습니다.

일반적으로 모든 것을 속성에 넣는 대신 함수에 넣는 것이 좋습니다. 이렇게하면 이러한 모든 범위 문제를 피할 수 있습니다. 그리고 on-...- 속성 대신 핸들러를 사용하는 것이 더 좋은 아이디어입니다.

onmouseover 특성 외부에서 함수를 정의하고이를 지우는 mouseout에서 다른 함수를 호출하십시오. 이 같은

뭔가 더 나은

var handler = (function(){ 
    var timerID; 
    function scrollLeft(){ 
     $('.inner_wrapper').animate({ 
      marginLeft: '-=30px' 
     }); 
    } 
    return{ 
     mouseover:function(){    
      timerID = setInterval(scrollLeft, 10); 
     }, 
     mouseout:function(){ 
      clearInterval(timerID); 
     } 
    } 
})(); 

다음

<div class="span1" onmouseover="handler.mouseover()" onmouseout="handler.mouseout()"> 

또는 (불쾌한 글로벌 한다거나 할을 피하기 위해)를 통해 직접 처리기를 바인딩 : 새로운 기준으로

$('.span1').hover(function() { 
    timerID = setInterval(scrollLeft, 10); //mouseover 
}, function() { 
    clearInterval(timerID); //mouseout 
}); 

jQuery 1.7, .on()이 선호됩니다.

+0

시도 로드 된 js 파일 onmouseover 및 onmouseout과 같은 인라인 JS 만 사용할 수 있습니다. 이 두 속성간에 변수를 공유하는 방법이 있다면 트릭을 수행합니다. (어떤 종류의 슈퍼 전역 변수와 마찬가지로, 전체 문서에 대해 유효합니다.) –

+0

@ user1364793 글쎄요, 그런 종류의 문제가 있습니다. 나는 그 사건에 대한 해결책을 모른다. – Christoph

0

귀하의

var timerID; 

변수는 onmouseover 핸들러 내부의 지역 변수로 정의됩니다, 그래서 onmouseout 핸들러는 그것에 대해 알 수 없습니다.

전역 변수로 선언하거나 더 나은 방법으로 필드에 timerID, 필드에 mouseovermouseout 처리기를 포함하는 객체로 캡슐화하십시오.

2
$(document).ready(function() { 
    var timerID = null; 

    function scrollleft() { 
     $('.inner_wrapper').animate({ 
      marginLeft: '-=30px' 
     }); 
    } 
    $('div.span1').hover(function() { 
     timerID = setInterval(scrollLeft, 10); 
    }, function() { 
     clearInterval(timerID); 
    }); 
});​ 

하고

$(document).ready(function() { 
    var timerID = null; 

    function scrollleft() { 
     $('.inner_wrapper').animate({ 
      marginLeft: '-=30px' 
     }); 
    } 

    $('div.span1').on('hover', function(e) { 
     if(e.type == 'mouseenter') { 
      timerID = setInterval(scrollLeft, 10); 
     } else { 
      clearInterval(timerID); 
     } 
    }); 
}); 
+0

자바에서 HTML을 분리 할 수 ​​없다는 점이 다릅니다. 나는 이것이 표준과 더 나은 마크 업 코딩 알고 있지만, 나는 그들이 (JS 외부 파일 또는 스크립트 태그로 둘러싸인) 인라인 (예를 들어, onMouseover와의)가 아닌 외부를 경우에만 스크립트의 실행 허용 대화 상자에 대한 라이브러리를 사용하고 있습니다. –

1

당신의 마크 업 및 자바 스크립트를 섞어 좋지 않아 다음 .on('hover')을 사용하는 경우는

<div class="span1"></div> 

처럼 html로합니다. 그들을 분할하고 다음과 같이 별도로 작업하십시오.

HTML :

<div class="span1"></div> 

자바 스크립트 :

var timerID = null; 

function scrollLeft() { 
    $('.inner_wrapper').animate({ 
     marginLeft: '-=30px' 
    }); 
} 

$(document).ready(function() { 
    $(".span1").hover(function() { 
     timerID = setInterval(scrollLeft, 10); 
    }, function() { 
     clearInterval(timerID); 
    }); 
}); 
+0

불행하게도 편집 한 질문에서 onmouseover 및 onmouseout과 같은 인라인 속성 외부에서 JS를 사용할 수 없습니다. –

1

timerId가이 onmouseout에 onMouseover와 정의,하지만하지 않습니다.

그래서 당신이 할 수있는 일은 다음과 같다 :

<script type="text/javascript"> 

    var scrollLeft = function(){ 
     $('.inner_wrapper').animate({ 
      marginLeft: '-=30px' 
     }); 
    }; 

    var timerID; 
    $(document).ready(function(){ 

     $("#timer").mouseover(function() { 

      timerID = setInterval(scrollLeft, 10); 


     }).mouseout(function() { 
      clearInterval(timerID) 
     }); 

    }); 

</script> 

<div class="span1" id="timer"> </div> 
+0

인라인 JS를 사용해야하므로이 옵션을 사용할 수 없습니다. onmouseover 특성을 사용하여 함수를 실행하고 onmouseout 특성으로 중지하는 방법이 필요합니다. –