This article 쿼크 모드에서 (아래쪽)를 사용하면 발생하는 것에 대한 설명과 당신을 도울 수있는 스크립트가 있습니다. 마우스 이벤트도
확인에 대한 크로스 브라우저 많은 정보가있다, 여기에 몇 가지 작업 코드입니다. 나는 이것이 가장 효율적이라고 약속하지 않거나 IE에서 메모리 누출을 일으키지 않을 것입니다 (IE에서 작동합니다 - 알려주세요). 이것이 사람들이 훨씬 더 안전하고 쉽게 라이브러리를 사용하는 이유입니다. 사용
// a general purpose, cross browser event adder
// returns a function that if run removes the event
function addEvent(el, eventType, handler, capturing) {
if(el.addEventListener) {
el.addEventListener(eventType, handler, capturing || false);
var removeEvent = function() { el.removeEventListener(eventType, handler, capturing || false) };
} else if(el.attachEvent) {
var fn = function() {
handler.call(el, normalise(window.event));
};
el.attachEvent('on'+eventType, fn);
var removeEvent = function(){ el.detachEvent('on'+eventType, fn) };
}
function normalise(e) {
e.target = e.srcElement;
e.relatedTarget = e.toElement;
e.preventDefault = function(){ e.returnValue = false };
e.stopPropagation = function(){ e.cancelBubble = true };
return e;
};
return removeEvent;
};
// adds mouseover and mouseout event handlers to a dom element
// mouseover and out events on child elements are ignored by this element
// returns a function that when run removes the events
// you need to send in both handlers - an empty function will do
function addMouseOverOutEvents(element, overHandler, outHandler) {
function out(e) {
var fromEl = e.target;
var toEl = e.relatedTarget;
// if the mouseout didn't originate at our element we can ignore it
if(fromEl != element) return;
// if the element we rolled onto is a child of our element we can ignore it
while(toEl ) {
toEl = toEl.parentNode;
if(toEl == element) return;
}
outHandler.call(element, e);
}
function over(e) {
var toEl = e.target;
var fromEl = e.relatedTarget;
// if the mouseover didn't originate at our element we can ignore it
if(toEl != element) return;
// if the element we rolled from is a child of our element we can ignore it
while(fromEl ) {
fromEl = fromEl.parentNode;
if(fromEl == element) return;
}
overHandler.call(element, e);
}
var killers = [];
killers.push(addEvent(element, 'mouseover', over));
killers.push(addEvent(element, 'mouseout', out));
return function() {
killers[0]();
killers[1]();
}
}
예 :
// add the events
var remover = addMouseOverOutEvents(
document.getElementById('elementId'),
function(e) {
this.style.background = 'red';
console.log('rolled in: '+e.target.id);
},
function(e) {
this.style.background = 'blue'
console.log('rolled out: '+e.target.id);
}
);
//remove the events
remover();
이미이 기사를 읽었습니다,하지만 난 여전히 내 시나리오에서 사용하는 방법을 이해할 수 없다? 마우스가 어디서 왔고 왔는지 확인해야합니까? RollOverDescription 함수 안에서 이것을 검사해야합니까? – luppi
예, mouseout 이벤트를 캡처하면 관련 타겟, 즉 롤오버 한 요소가 요소의 하위 요소인지 확인하고 아무 것도하지 않는지 확인합니다. mouseover 이벤트에 대해서도이 작업을 수행 할 수 있지만 그다지 중요하지는 않습니다. 나는 작은 동안 기다릴 수 있다면 예제를 쓸 것이다 – meouw
나는 기다릴 수있다, – luppi