win.gevent = {
handle : function(event){
var all, handlers
//Packaging event
event = 인수[0] = gevent.fix( event || window.event );
event.currentTarget = this;
//여기...
var 네임스페이스 = event.type.split( "."); 🎜>event.type = 네임스페이스.shift();
all = !namespaces.length;
var 네임스페이스 = RegExp("(^|\.)" 네임스페이스.slice().sort().join( ".*\.") "(\.|$)");
//이 요소의 이 동작에 대한 이벤트 목록 가져오기
handlers = (data(this, "events" ) || {} )[event.type];
//이 이벤트 목록을 탐색하여 실행을 실행합니다
for ( var j in handlers ) {
var handler = handlers[j]
if ( all | | 네임스페이스.테스트(handler.type) ) {
// 핸들러 함수 자체에 대한 참조를 전달합니다
// 나중에 제거할 수 있도록
// jq에서 주석은 다음과 같이 작성됩니다. . 이벤트 핸들러는 편의상 이 이벤트를 참조하며 나중에 제거할 수 있습니다.
// 하지만 이벤트 핸들러는 제거에 사용되지 않습니다. 그리고 이벤트가 여러 개인 경우에는 이 이벤트가 사용됩니다. 이벤트는
event.handler = handler;//이벤트를 실행하며 요소로 호출되는 이벤트입니다. 이벤트에서 이를 사용하여 < 함수의 반환 값으로 요소를 실행할 수 있습니다. 🎜>var ret = handler.apply(this, 인수);
//반환 값이 있고 반환 값이 false인 경우 실행 시 이벤트 버블링이 방지되고 이벤트 실행이 방지됩니다. 🎜>if( ret !== 정의되지 않음 ){
event.result = ret;
if ( ret === false ) {
event.preventDefault()
event.stopPropagation();
}
}
}
}
},
props: "altKey attrChange attrName 버블 버튼 취소 가능 charCode clientX clientY ctrlKey currentTarget 데이터 세부정보 eventPhase fromElement 핸들러 keyCode MetaKey newValue OriginalTarget pageX pageY prevValue 관련노드 관련Target screenX screenY ShiftKey srcElement target toElement view WheelDelta which".split(" "),
fix : function(event){
//new setEvent는 이벤트에 확장 속성을 제공합니다. 속성이 있는 경우 , 이는 이벤트가 생성되었음을 의미합니다.
if (event[expando] )
return event
//원래 이벤트 유지
// new 새 이벤트는 원래 이벤트와 다릅니다.
var originalEvent = event;
event = new setEvent (originalEvent)
//원래 이벤트의 속성 값을 얻으려면 this.props를 참조하세요.
for ( var i = this.props.length, prop; i; ){
prop = this.props[ --i ]
event[ prop ] = originalEvent[ prop ]; }
//대상 요소를 event.target으로 통합
if ( !event.target )
event.target = event.srcElement || document // srcElement가 정의되지 않을 수 있는 #1925 수정;
//텍스트 노드인 것으로 확인되면 해당 상위 노드를 가져옵니다.
if ( event.target.nodeType == 3)
event.target = event.target.parentNode
if; ( !event.관련Target && event.fromElement )
event.관련Target = event.fromElement == event.target ? event.toElement : event .fromElement
return event; >win.setEvent = function(src){
// 'new' 키워드 없이 인스턴스화 허용
// 이벤트 객체
if( src && src.type ){
this.originalEvent = src ;
this.type = src.type;
// 이벤트 유형
}else
this.type = src;// Firefox의 일부 이벤트에는 버그가 있습니다.(#3843)
// 따라서 기본 값을 사용하지 않습니다.
this.timeStamp = now();
// 고정됨으로 표시
this[expando] = true
} 🎜>function returnFalse(){
return false;
}
function returnTrue(){
return true
}
setEvent.prototype = {
preventDefault: function( ) {
var e = this.originalEvent;
if( !e )
return;
// PreventDefault가 존재하는 경우 원래 이벤트에서 실행
if (e.preventDefault)
e.preventDefault();
// 그렇지 않으면 원래 이벤트의 returnValue 속성을 false로 설정합니다(IE)
e.returnValue = false;
stopPropagation: function() {
var e = this.originalEvent;
if( !e )
return;
// stopPropagation이 존재하는 경우 원래 이벤트에서 실행
if (e.stopPropagation)
e. stopPropagation();
// 그렇지 않으면 원래 이벤트의 cancelBubble 속성을 true로 설정합니다(IE)
e.cancelBubble = true ;
},
stopImmediatePropagation:function(){
this .isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
},
isImmediatePropagationStopped: returnFalse
}; >
코드 복사
코드는 다음과 같습니다.