2

backbone.js를 사용하여이 이벤트를 트리거 할 때 event.type이 mouseenter에서 mouseover로 변경되어 콘솔 로그가 " mouseenter "이고 두 번째 로그는"mouseover "입니다 왜 변환 ??? 500 밀리 초 나중에 내 마우스가 이미 내 마우스 이벤트에 걸쳐 있기 때문에 실제로 마우스 오버는, 그래서 그 트리거 될 때 "입력"때문에_.delay 마우스 위치에서 mouseover로 내 e.type 바꾸기

app.newsroomPageElementView = Backbone.View.extend({ 
events: { 
    'mouseenter .featured-image': 'imageHover', 
    'mouseleave .featured-image': 'imageHover' 
}, 
imageHover: function (e) { 
     Y.log(e.type); // this outputs out mouseenter 
     _.delay(function(){ 
     Y.log(e.type); // this outputs mouseover 
     }, 500); 
    },  
}); 

은 무엇입니까?

+0

명시 적으로'e' 객체를 전달하십시오 :'_.delay (function (e) {...}, 500, e);' –

+0

또한'_.delay' 대신'setTimeout'을 사용하여 if 이 동작은'_.delay'에 의해 발생합니다 (비록 그것이 어떻게 될지는 모르지만). –

답변

1

Backbone에서 다시 참조 할 개체에 대한 참조를 제공하기 때문에 이러한 현상이 발생합니다.

알다시피, mouseenter 이벤트 다음에 mouseover 이벤트가옵니다. mouseover에 대한 처리기가 없으므로 일반적으로 신경 쓰지 않아도됩니다.

mouseenter 이벤트가 발생하면 처리기가이 개체 e과 함께 호출됩니다. 이것은 Backbone 내의 일부 객체에 대한 참조입니다. type을 기록하지만 delay 핸들러에 해당 오브젝트에 대한 참조를 보유합니다.

그런 다음 이벤트 핸들러가 반환되고 Javascript 스레드로 제어가 반환됩니다. mouseover 이벤트가 발생합니다. 코드에서 무시할 수 있지만 백본은 계속해서 전달한 개체를 다시 사용하고 mouseover 이벤트에 대한 정보를 넣습니다.

지연 시간이 만료되고 e을 사용하여 이벤트의 유형을 확인하십시오. 이제는 mouseover 이벤트 데이터가 모두 포함되어있는 것을 볼 수 있습니다.

이것은 우리 모두에게 유익한 교훈입니다. 먼저 JS는 객체 참조를 처리하고 코드 이외의 다른 객체를 저장 한 다음 스레드를 중단하면 해당 객체가 사용자 아래에서 변경 될 수 있다는 점에 유의하십시오. 마찬가지로 배열이나 객체를 반환하는 메소드가있는 경우 해당 배열이나 객체에 대한 참조를 반환한다는 것을 알고 있습니다 ... 따라서 호출 코드가 상기 배열이나 객체의 내용을 변경하면 이로 인해 혼란 스러울 수 있습니다. 이것은 공용 getter가있는 개인 필드가있을 때 특히 위험합니다. 조심하지 않으면 코드없이 내부 객체를 변경할 수있는 참조를 넘길 수 있습니다.

+2

[ "mouseenter' 자바 스크립트 이벤트는 Internet Explorer가 소유하고 있습니다.이 이벤트의 일반적인 유틸리티 때문에 jQuery는 브라우저와 상관없이 사용할 수 있도록이 이벤트를 시뮬레이트합니다."] (http://api.jquery.com/mouseenter /). 이 단일 이벤트 객체의 재사용은 시뮬레이션 된'mouseenter' 및'mouseleave' 이벤트에만 해당되는 것으로 생각됩니다. 'e'에 추가 속성을 붙이면 몇 가지 힌트를 얻을 수 있습니다 : http://jsfiddle.net/ambiguous/J2MFd/ –

+0

그래서 최종 평결은 무엇입니까? 이 기능에 대해 걱정할 필요가있는 문제가 있습니까? 마이크로 소프트의 사이트에서 예를 들어 특정 마우스 센터 이벤트가 마우스 오버보다 작다는 것을 보여 주지만 기술적으로 mouseenter까지 백본으로 호출되지 않기 때문에 이벤트가 변경된다면 문제가되지 않을 것입니다. 그 초기 마우스 센터에서만 여전히 트리거되어야하며 지연은 성공적인 마우스 센터 이후에만 발생합니다.이 마우스 포인트는 그것이 다시 열리기 전에 마우스를 놓아야합니다. ?? – Zuriel

+0

@ZurielAndrusyshyn : 참조 문제를 피하기 위해 항상'e'를 복제 할 수 있습니다. –

관련 문제