>  기사  >  웹 프론트엔드  >  jQuery 소스코드 이벤트 분석 분석_jquery

jQuery 소스코드 이벤트 분석 분석_jquery

WBOY
WBOY원래의
2016-05-16 18:25:271247검색

이벤트의 동작은 addEvent, fireEvent, RemoveEvent 3가지 이벤트 메소드에 지나지 않습니다. 일반적으로 lib는 호환성 메모리 누수와 같은 문제를 해결하기 위해 브라우저에서 제공하는 기능을 일부 확장합니다. 세 번째 질문은 domReady 상태를 얻는 방법입니다.
 6.1 이벤트 패키지

브라우저 이벤트 호환성이 골치아픈 부분입니다. IE의 이벤트는 전역 창 아래에 있는 반면 Mozilla의 이벤트는 이벤트 소스 매개변수가 콜백 함수에 전달되는 것입니다. 다른 많은 이벤트 처리 방법도 있습니다.

Jquery는 이벤트 패키지를 제공하는데, 이는 다른 라이브러리에서 제공하는 것보다 조금 더 간단하지만 사용하기에는 충분합니다.

코드 복사 코드는 다음과 같습니다.

//이벤트를 래핑합니다.
수정: function(event) {
if (event[expando] == true) return event;//이벤트가 래핑되었음을 나타냅니다.
//원래 이벤트를 저장하고 하나를 복제합니다.
varoriginEvent = 이벤트; ①
이벤트 = {originEvent :originEvent}
for (var i = this.props.length, prop;i;) {
-i]; event[prop] = originalEvent[prop];
  } 
  event[expando] = true; event.preventDefault = function() { ②
    // 원래 이벤트에서 실행
   if (originalEvent. PreventDefault)
  originEvent.preventDefault();
 originEvent.returnValue = false;
 }
Event.stopPropagation = function() {
🎜>   }; 올바른 timeStamp
  event.timeStamp || now();
  // 올바른 대상
  if (!event.target)    ③
  event.
 if (event.target.nodeType == 3)//텍스트 노드가 상위 노드입니다.
Event.target = event.target.parentNode;
// 관련Target
if (!event.관련Target && event.fromElement) event.관련Target = event.fromElement == event.target
    ? .toElement : event.fromElement;
   // 누락된 경우 페이지X/Y를 계산하고 클라이언트X/Y를 사용할 수 있음
  if (event.pageX == null && event.clientX != null) { ⑥
var doc = document.documentElement, body = document.body;
event.pageX = event.clientX
(doc && doc.scrollLeft || body && body.scrollLeft || 0)
- (doc .clientLeft || 0);
event.pageY = event.clientY
(doc && doc.scrollTop || body && body.scrollTop || 0)
- (doc.clientTop || 0);   event.which = event.charCode || event.keyCode;
 
  // Mac 이외의 브라우저에 메타키 추가
  if (!event.metaKey && event.ctrlKey )       8
   event.metaKey = event.ctrlKey;
  // 클릭할 항목 추가: 1 == left; 2 == middle; 3 == right
  // 버튼은 정규화되지 않았으므로 사용하지 마세요. it
  if (!event.which && event.button)  9
   event.which = (event.button & 1 ? 1 : (event.button & 2
    ? 3 : (event .button & 4) ? 2 : 0)));
 
},



위 코드는 ①에서 원본 이벤트의 참조를 유지하고 원본 이벤트를 복제합니다. 이 복제 이벤트를 마무리하세요. ② 원본 이벤트에 PreventDefault, stopPropagation 메소드를 실행하여 기본 이벤트 액션 발생을 방지할지, 버블링 이벤트가 위쪽으로 전달되는 것을 중지할지 여부를 결정합니다.

③대상이 수정되었습니다. srcElement는 IE에서 동시에 사용되며, 텍스트 노드 이벤트의 경우 대상이 상위 노드로 전달되어야 합니다.

 4 관련Target은 마우스아웃 및 마우스오버에만 유용합니다. IE에서는 to와 from이라는 두 개의 Target 변수로 나누어져 있는데, Mozilla에서는 분리되어 있지 않습니다. 호환성을 보장하기 위해 관련 타겟을 사용하여 이를 통합합니다.

 ⑥은 행사의 좌표 위치입니다. 이는 페이지에 상대적입니다. 페이지를 스크롤할 수 있는 경우 해당 클라이언트에 스크롤을 추가해야 합니다. IE에서는 기본 2px 본문 테두리도 빼야 합니다.

7번 포인트는 키보드 이벤트의 키를 event.which의 속성으로 통일한 것입니다. Ext의 구현은 ev.charCode || ev.keyCode || 0입니다. ⑨는 event.which에서 마우스 이벤트 키를 통합하는 것입니다. charCode, ev.keyCode 중 하나는 문자 키이고, 다른 하나는 문자 키가 아닙니다. 9 호환성 처리를 위한 사용 및 방법. Ext는 다음 세 줄의 호환성 문제를 해결합니다.

var btnMap = Ext.isIE ? {1:0,4:1,2:2} : (Ext.isSafari ? {1:0,2:1,3:2} : {0:0 ,1:1,2:2}); this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1)

  ① ② ③ ④ ⑥ ⑧ ⑩

 6.2 이벤트 처리

 Jquery는 이벤트 등록, 제거 및 실행을 위한 몇 가지 메서드를 제공합니다.

 6.2.1 등록

jquery에서는 이벤트 등록을 위해 바인딩, 원, 토글, 호버 4가지 방법을 제공하며 가장 기본적인 방법입니다. 하나는 한 번만 실행되도록 등록된 메소드이고, 토글은 교대로 실행되도록 등록된 메소드입니다. Hover는 마우스 호버링을 등록하는 방법입니다.
코드 복사 코드는 다음과 같습니다.

bind : function(type, data, fn ) {
return type == "unload" ? this.one(type, data, fn) : this
.each(function() {// fn || data, fn && data는 데이터 매개변수를 인식합니다. 선택사항입니다
    jQuery.event.add(this, type, fn || data, fn && data)
   }) },



unload 이벤트는 한 번만 실행할 수 있으며 다른 이벤트는 기본 등록 방법을 사용합니다.

// 일치하는 각 요소의 특정 이벤트(예: 클릭)에 일회성 이벤트 핸들러 함수를 바인딩합니다.
//각 개체에서 이 이벤트 핸들러는 한 번만 실행됩니다. 그 외의 규칙은 Bind() 함수와 동일합니다.
// 이 이벤트 핸들러는 기본 동작(브라우저)을 방지하는 데 사용할 수 있는 이벤트 개체를 수신합니다.
// 기본 동작을 취소하고 이벤트 버블링을 방지하려면 이 이벤트 처리 함수가 false를 반환해야 합니다.
코드 복사 코드는 다음과 같습니다.

  one : function(type, data, fn ) {
var one = jQuery.event.proxy(fn || data, function(event) {
jQuery(this).unbind(event, one);
return (fn || data). apply(this , 인수);/this->현재 요소
  });
   return this.each(function() {
    jQuery.event.add(this, type, one, fn && 데이터)
   })
  },

One과 바인딩은 기본적으로 동일합니다. 차이점은 jQuery.event.add를 호출할 때 등록된 이벤트 처리 기능이 약간 조정된다는 점입니다. 들어오는 이벤트 처리 기능을 프록시하기 위해 jQuery.event.proxy라는 이름이 사용되었습니다. 이벤트가 이 에이전트의 함수 호출을 트리거하면 해당 이벤트가 먼저 캐시에서 삭제된 후 등록된 이벤트 함수가 실행됩니다. 다음은 fn에 의해 등록된 이벤트 함수의 참조를 얻는 클로저의 적용입니다.

//호버 이벤트(마우스가 개체 위로 이동하고 개체 밖으로 이동)를 시뮬레이션하는 방법입니다.
//자주 사용하는 작업에 대해 "유지" 상태를 제공하는 사용자 정의 방법입니다.
//일치하는 요소 위로 마우스를 이동하면 지정된 첫 번째 기능이 트리거됩니다. 마우스가 이 요소 밖으로 이동하면
/는 지정된 두 번째 기능을 트리거합니다. 또한 마우스가 여전히 특정 요소(예: div의 이미지)에 있는지 여부를 감지합니다.
// 그렇다면 트리거하지 않고 계속 "호버" 상태를 유지합니다. move-out 이벤트(mouseout 이벤트를 사용한 일반적인 오류 수정)
마우스 오버: function(fnOver, fnOut) {
return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut),



Hover는 바인드를 기반으로 합니다.

//클릭할 때마다 순차적으로 함수를 호출합니다.
toggle: function(fn) {
var args = 인수, i = 1;
while (i < args.length)//각 함수에 GUID가 할당됨
jQuery.event.proxy ( fn, args[i ]);//수정된 항목은 여전히 ​​args에 있습니다
return this.click(jQuery.event.proxy(fn, function(event) {//GUID 할당  this.lastToggle = (this. lastToggle || 0) % i; // 이전 함수 event.preventDefault(); // 기본 동작 방지
// 매개변수에서 함수 실행, 배열과 같은 매개변수를 사용할 수 있음
return args[this. lastToggle].apply(this,arguments)||false;
 }));
 },

  Toggle의 매개변수는 여러 개일 수 있습니다. 먼저 코딩하여 UUID를 생성합니다. 그런 다음 click 메소드를 호출하여 에이전트의 콜백을 다시 등록하십시오. 이 함수는 이벤트가 트리거될 때 실행됩니다. 먼저 매개변수의 함수가 마지막으로 실행된 시간을 계산합니다. 그런 다음 기본 작업을 방지합니다. 그런 다음 실행할 다음 기능을 찾으십시오.

//jquery 객체에 일반적으로 사용되는 이벤트 메서드 추가
jQuery.each(
  ("blur, focus, load, resize, scroll, unload, click, dblclick,"
"mousedown ,mouseup,mousemove,mouseover,mouseout,change,select,"
"submit,keydown,keypress,keyup,error").split(","),
function(i, 이름) {jQuery.fn [name] = function(fn) {
     return fn? this.bind(name, fn) : this.trigger(name);
   };}); 이벤트 처리 방법에는 위에서 호출한 클릭이 포함됩니다. 여기서는 등록을 위해 여전히 바인딩이 호출되는 것을 볼 수 있습니다. 물론 이벤트는 프로그램을 통해 실행될 수도 있습니다.



위의 방법 중 대부분은 이벤트를 등록하는 것이며, 이는 궁극적으로 등록 기능을 완료하기 위해 jQuery.event.add()에 속합니다. Dom0 또는 DOM1의 이벤트 메서드를 사용하는 경우 elem.onclick=function(){}을 사용하여 요소의 특정 이벤트에 대한 핸들러 함수를 등록합니다. 이것의 가장 큰 단점은 각 이벤트가 단지 처리 기능일 뿐이라는 것입니다. dom1 메소드가 개선되었습니다. elem.addEventListener(type, handler, false)를 사용하여 요소 이벤트에 대한 여러 핸들러 함수를 등록할 수 있습니다.

이 처리 방법은 완벽하지 않습니다. 이 이벤트를 한 번만 실행하면 조금 번거로울 것입니다. 이벤트 수신을 취소하려면 이벤트 처리 함수 끝에서 elem.removeEventListener를 수행해야 합니다. 그렇게 하면 비즈니스 문제가 발생할 수 있습니다. 이벤트 수신을 취소하기 전에 첫 번째 이벤트 처리 함수가 다시 트리거되면 어떻게 되나요?

커스텀 이벤트 등록 및 처리를 지원하지 않고, 여러 이벤트에 대해 동일한 핸들러 기능을 등록할 수 없는 브라우저 방식도 있습니다.



코드 복사 코드는 다음과 같습니다.

jQuery.event = {//요소에 이벤트를 추가합니다.
add : function(elem, types, handler, data) {
if (elem.nodeType == 3 || elem.nodeType == 8) return; // 빈 노드 또는 주석
  // IE 창으로 전달할 수 없으므로 먼저 복사하십시오.
if (jQuery.browser.msie && elem.setInterval) elem = window;
// 핸들러에 전역 고유 ID 할당
if (!handler.guid) handler.guid = this.guid; <… (this,arguments);});
handler.data = data;
 }
// 요소의 이벤트를 초기화합니다. 이벤트의 값을 얻지 못한 경우 데이터를 초기화합니다. {}  ②
var events =jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),
// 핸들의 값을 얻지 못한 경우 데이터를 초기화합니다: function() {....}   ③
handle = jQuery.data(elem, "handle")|| jQuery.data(elem, "handle" ,
function() {//트리거의 두 번째 이벤트를 처리하고 페이지가 언로드된 후 이벤트를 호출합니다.
  if (typeof jQuery != "undefine"&& !jQuery.event.triggered)
Return jQuery.event.handle.apply(//callee.elem=handle.elem
인수.callee.elem, 인수)
})// elem을 핸들 속성으로 추가, 메모리 방지 로컬 이벤트가 없기 때문에 IE에서 누출이 발생합니다.
handle.elem = elem;
// 여러 이벤트 이름을 구분하려면 공백을 사용하세요(예: jQuery(...).bind("mouseover mouseout", fn)
jQuery.each(types. Split(/s /), function(index, type) {   ④
  // 네임스페이스 이벤트는 일반적으로 사용되지 않습니다.
var parts = type.split(".");type = parts[.0]; handler.type = parts[1];
// 이 요소의 유형 이벤트에 바인딩된 모든 핸들러
var handlers = events[type] ⑤
if (!handlers) {// 이벤트 초기화 핸들러 목록을 찾을 수 없는 경우 대기열
handlers = events[type] = {};
// 유형이 준비되지 않았거나 준비 실행 설정이 false를 반환하는 경우 ⑥
if (!jQuery.event . Special[type]|| jQuery.event.special[type].setup
  .call(elem, data) === false) {// 이벤트 등록을 위해 시스템 이벤트 함수 호출
if(elem .addEventListener )elem.addEventListener(type,handle,false);
else if (elem.attachEvent)elem.attachEvent("on" type, handler)
   }
}
// Put 핸들러 id 및 핸들러 양식 속성 쌍의 형식은 핸들러 목록에 저장됩니다.
// events[type][handler.guid]
handlers[handler.guid] = handler;       7
/ / 이 이벤트의 사용 식별자를 전역적으로 캐시합니다
jQuery.event.global[type] =
})
 
 elem = null;
 },
guid: 1,
전역: {},




jQuery.event.add는 jQuery.data를 이용하여 이벤트 이름과 이벤트에 관련된 처리 기능을 유기적이고 질서 있게 결합하여 jQuery.cache의 요소에 해당하는 공간에 저장합니다. 예를 들어 추가 프로세스를 분석해 보겠습니다. 다음 jQuery(e1).bind("mouseover mouseout", fn0);jQuery(e1).bind("mouseover mouseout", fn1) 문을 받으면

jQuery(e1).bind("mouseover mouseout", fn0);, ② ③이 캐시에서 숫자를 가져올 수 없으므로 먼저 초기화하세요. 현재 캐시: {e1_uuid:{events:{},handle:fn}}. 그러면 ⑤에서 mouseover mouseout 이름이 초기화됩니다. 현재 캐시: {e1_uuid:{events:{ mouseover:{}, mouseout:{}},handle:fn}}. ⑥에서 브라우저 이벤트에 핸들러 함수를 등록합니다. 그런 다음 ⑦은 이벤트 이름에 핸들러 기능을 추가합니다. 현재 캐시: {e1_uuid:{events:{mouseover:{fn0_uuid:fn0},mouseout:{ fn0_uuid:fn0}},handle:fn}}. 여기서는 프록시를 사용하여 함수에 대한 uuid를 생성하는 역할을 볼 수 있습니다.

jQuery(e1).bind("mouseover mouseout", fn1), ②③ 둘 다 캐시 {e1_uuid:{events:{mouseover:{fn0_uuid:fn0},mouseout:{ fn0_uuid: fn0}에서 데이터를 가져옵니다. }, 그리고 ⑤에서 mouseover:{fn0_uuid:fn0}, mouseout:{ fn0_uuid:fn0}의 참조를 가져옵니다. 그런 다음 ⑦은 이벤트 이름에 핸들러 함수를 등록합니다. 현재 캐시: {e1_uuid:{events:{mouseover:{fn0_uuid:fn0, fn1_uuid:fn1,},mouseout:{ fn0_uuid:fn0, fn1_uuid:fn1}},handle:fn}}.

jQuery.event.add의 매우 중요한 작업은 등록된 이벤트 함수를 순서대로 저장하는 것입니다. 제거 및 실행 이벤트의 기능을 찾을 수 있도록 합니다.

//{elem_uuid_1:{events:{mouseover:{fn_uuid:fn1,fn_uuid1:fn2},
     //mouseout:{fn_uuid:fn1,fn_uuid1:fn2}},handle:fn}}

  6.2.2 트리거



  onclick 등의 등록된 이벤트입니다. 그런 다음 사용자가 이 요소를 클릭하면 이 이벤트의 등록된 이벤트 핸들러가 자동으로 트리거됩니다. 그러나 때로는 이벤트 트리거링을 시뮬레이션하기 위해 프로그램을 사용하려는 경우 이벤트 강제 트리거링을 사용해야 합니다. IE에서는 이를 달성하기 위해 .fireEvent()를 사용할 수 있습니다. 예를 들어,
, 버튼이 form.submit()을 사용하여 양식을 제출하면 onsumbit 이벤트가 활성화되지 않습니다. 필요한 경우 $(" :form")[0 ].fireEvent("onsubmit",), 이는 이벤트를 트리거합니다.

Mozilla에는 세 가지 단계가 있습니다: var evt = document.createEvent('HTMLEvents')

evt.initEvent('change',true,true); ;

프로토타입에서는 이런 식으로 구현됩니다. 따라서 jquery에서는 구현이 약간 다릅니다.
코드 복사 코드는 다음과 같습니다.

trigger: function(type, data, fn ) {
return this.each(function() {
 jQuery.event.trigger(type, data, this, true, fn);
   }) },

 트리거에는 세 가지 유형의 매개변수가 있으며, 데이터 매개변수는 등록된 이벤트 기능에 대한 실제 전송을 제공합니다. 방지Default가 data[0]에 존재하는 경우 data[0]은 사용자 정의 래핑 이벤트를 위한 공간으로 사용될 수 있습니다. Fn은 이벤트에 대해 즉시 사용 가능한 이벤트 처리 방법을 제공할 수 있습니다. 즉, 이벤트를 등록하지 않고 핸들러 함수만 전달하면 이벤트를 처리할 수 있다. 등록되어 있으면 원래의 이벤트 처리 기능 이후에 실행됩니다.

  //이 메서드는 지정된 이벤트 유형에 바인딩된 모든 핸들러를 트리거합니다. 그러나 브라우저 기본 작업은 실행되지 않습니다.
triggerHandler: function(type, data, fn) {
return this[0]&& jQuery.event.trigger(type,data,this[0],false, fn );
 },



  TriggerHandle은 jQuery.event.trigger의 donative 매개변수를 false로 설정하여 브라우저 기본 처리 방법의 실행을 방지합니다. 트리거와 차이점은 jquery 객체의 첫 번째 요소만 처리한다는 것입니다.

위의 두 메서드 모두 jQuery.event.trigger를 호출하여 작업을 완료합니다.
코드 복사 코드 다음과 같습니다:

trigger: function(type, data, elem, donative, extra) {
 data = jQuery.makeArray(data);//data는 {xx:yy}일 수 있습니다.
 //getData 지원 !이 형식에서 Exclusive = true는 등록된
// add 이벤트의 모든 기능이 네임스페이스 분류에 따라 실행된다는 의미입니다.
if (type.indexOf("!") >= 0) {        ①
  type = type.slice(0, -1);var Exclusive = true
  }
if (! elem) {// 전역 화재 이벤트 처리 ②
  if (this.global[type])
  jQuery.each(jQuery.cache, function() {
  // 캐시에서 등록된 모든 파일 찾기 이벤트의 핸들러 함수를 트리거하는 이벤트 요소
if (this.events && this.events[type])
jQuery.event.trigger(type, data, this.handle.elem)
} ; = jQuery.isFunction(elem[type] || null),
// 데이터 매개변수가 브라우저의 이벤트 객체가 아닌 경우 이벤트 변수는 true입니다.
// 데이터 매개변수 자체는 true입니다. 그룹인 경우 첫 번째 요소가 브라우저의 이벤트 개체가 아닌 경우 true입니다.
  //이벤트의 경우 true입니다. 즉, 이벤트가 전달되지 않으면 먼저 가짜 이벤트 객체가 생성되어 data[0]에 존재합니다.
 event = !data[0] || !data[0].preventDefault;
  // 이벤트 객체를 전달하지 않고 가짜 이벤트 객체를 생성합니다.
 if(event) {//배열에 저장된 첫 번째 것 ④
  data.unshift( { type : type, target : elem,
   PreventDefault : function() {},stopPropagation :
function() {}, timeStamp : now() });
data[0][expando] = true; // 가짜 이벤트 객체를 수정할 필요가 없습니다.
}
data[0].type = type; //이벤트 이름 오류 방지
//이벤트 등록 기능의 실행을 분류(네임스페이스)합니다. 전부는 아닙니다.
  if (exclusive) data[0].exclusive = true;
 
  // 프로토타입 등 기존 처리 방식과 달리, fireEvent를 사용하지 않음
  // Fire가 브라우저에 등록됨 Event Handling 이벤트의 메소드.
// 여기에는 세 가지 단계가 있습니다. 먼저 jQuery.event.add를 통해 등록된 이벤트를 실행합니다.
// 사용자 정의 이벤트일 수 있습니다(브라우저 이벤트에 등록되지 않음).
// 두 번째 단계는 elem.onclick 메소드를 통해 Fire로 등록된 이벤트의 로컬 처리 기능입니다.
// 세 번째 단계는 Fire의 기본 이벤트 처리 메소드입니다(로컬 onclick 메소드로 등록됨
/ / 존재하지 않습니다).  //elem.onfoo=function()과 같은 로컬 처리 방법을 등록하여 처리가 시작됩니다.
 //그러나 링크의 .click( ) 트리거되지 않으면 addEvent
// 메소드를 통해 등록된 이벤트 처리 메소드가 실행되지 않습니다.
  if ((!fn || (jQuery.nodeName(elem, 'a') && type == "click")) ⑥
    && elem["on" type]&& elem["on" type] .apply(elem,data) === false)
 val = false
//처음 몇 가지 추가 함수 매개변수는 데이터를 통해 제공됩니다. 위조된 이벤트는 여기에서 제거됩니다.
//마지막 매개변수는 일련의 이벤트 처리 함수가 반환하는 결과로, 일반적으로 부울 값입니다.
//이 함수는 이 결과를 기반으로 마무리 작업을 처리할 수 있습니다.
 if (event) data.shift();
// 처리하면 extra에서 제공하는 함수 처리가 트리거됩니다.
if (extra && jQuery.isFunction(extra)) { ⑦
ret = extra.apply(elem, val == null ? data : data.concat(val))
//이 함수의 경우 반환 값이 있으면 트리거의 반환 값은 해당 반환 값입니다.
// 그렇지 않은 경우 일련의 이벤트 처리 함수 중 마지막 반환 값입니다. 일반적으로 bool
  if (ret !== undefine) val = ret;
  }
  // .onclick과 같은 등록된 이벤트가 없을 때 기본 로컬 이벤트 메서드를 실행합니다.
// 앞의 내용을 추가합니다. 실행 이벤트 핸들러 함수의 반환 값이 false인 경우에만 실행됩니다.
//실행 여부를 제어하기 위해 donative를 통해 제어할 수도 있습니다.  this.triggered = true;
 try {elem[type](); //숨겨진 요소에 대해 IE가 보고합니다. 오류
  } catch(e) {}
  }
this.triggered = false;
 }
return val;


Jquery의 fire 이벤트 방식은 프로토타입에서의 구현과는 전혀 다릅니다. Ext와 YUI는 트리거 이벤트를 강제하는 방법을 제공하지 않습니다. 일반적으로 브라우저 이벤트를 실행하는 프로그램은 fireEvent 또는 dispatchEvent 메서드를 사용하여 실행해야 합니다.

하지만 jquery는 다른 접근 방식을 취합니다. jquery.event.add를 통해 등록된 이벤트(사용자 정의했거나 브라우저 이벤트에 등록했는지 여부)의 경우 요소 및 이벤트 이름에 해당하는 캐시에 저장됩니다. 브라우저 트리거에서는 이는 효과가 없습니다. 하지만 프로그램을 기다리다가 강제로 트리거가 되었을 때 해당 이벤트 처리 기능을 캐시에서 얻어오기 위한 것입니다. 이때 브라우저 이벤트는 삭제됩니다. 일부 사용자 정의 이벤트 기능도 여기에서 실행될 수 있습니다. ⑤와 같습니다.

click 또는 elem.onclick=function(){}과 같은 html 태그를 통해 등록된 이벤트 함수의 경우. ⑥에서는 onclick 형태의 콜백 함수를 사용하여 요소를 실행합니다. 이 dom0 메서드를 통해 하나의 함수만 등록할 수 있습니다.

가끔 onclick과 같은 이벤트 핸들러가 없으면 브라우저는 기본 핸들러를 실행합니다. form.submit()과 같은 것입니다. 8번을 보면 이러한 기본 이벤트 처리도 donative 매개변수를 통해 제어할 수 있음을 알 수 있다.

프로그램이 이벤트를 수동으로 트리거합니다. 한 가지 문제는 이벤트가 생성되는 방식입니다. 즉, 이벤트를 생성하여 함수에 전달하는 브라우저가 없습니다. 프로토타입은 새로 생성된 dataavailable 이벤트를 사용합니다. 그러한 사건은 거의 영향을 미치지 않습니다. Jquery는 또한 가짜를 사용하여 ④와 같은 이벤트를 하나씩 위조합니다. 프로토타입 이벤트에 비해 Jquery의 장점은 트리거 함수의 매개변수를 통해 필요한 이벤트를 전달할 수 있다는 것입니다. 프로토타입은 할 수 없습니다.

위의 분석을 통해 Jquery는 브라우저의 트리거 이벤트 실행 과정을 시뮬레이션하여 이 트리거 기능을 구축한다는 것을 알 수 있습니다. 먼저 dom1 모드에 등록된 이벤트(addEvent)를 실행한 다음 dom0 모드에 등록된 이벤트를 실행하고 마지막으로 기본 이벤트 처리를 실행할지 확인합니다.

⑦에서 트리거는 콜백 함수와 매개변수를 전달하여 실행된 이벤트 처리 함수의 결과에 대한 판단 및 처리를 완료하고, 새로운 결과를 형성하여 이를 반환할 수도 있음을 알 수 있습니다. 트리거 기능. 이것은 때때로 유용합니다.



이 외에도 이벤트 처리 기능(네임스페이스)을 분류할 수 있으며, 적절한 시점에 다양한 카테고리의 이벤트 처리 기능을 호출할 수 있습니다(jquery.event.add를 통해 등록) ). 이 분류의 처리는 핸들에서 구현됩니다.
코드 복사 코드는 다음과 같습니다.

핸들: function(event) {
// 정의되지 않음 또는 false를 반환합니다.
  var val, ret, 네임스페이스, all, handlers
  // 전달된 매개변수를 수정했습니다. 여기에는 참조가 있습니다.
Event = 인수[0] = jQuery.event.fix(event || window.event)
// 네임스페이스 처리
네임스페이스 = event.type.split("."); Event.type = 네임스페이스[0];
Namespace = 네임스페이스[1];
// all = true는 핸들러, 네임스페이스가 존재하지 않음을 나타내고
//event.exclusive가 존재하지 않음을 나타냅니다. is false When, all=true.
All = !namespace && !event.exclusive
// 요소의 이벤트에 캐시된 이벤트 이름의 핸들러 목록을 찾습니다.
handlers = (jQuery.data(this, " events") || {})[event.type];
for (var j in handlers) { // 각 핸들러 함수가 실행됩니다.
var handler = handlers[j] // 필터 클래스별 함수
   if (all || handler.type == 네임스페이스) {
    // 나중에 삭제하기 위해 참조를 전달합니다.
   event.handler = handler; handler.data;//
ret 추가 시 추가됨 = handler.apply(this, 인수);//이벤트 처리 함수 실행
if (val !== false)
val = ret;// 하나의 처리 함수가 false를 반환하는 한, 이 함수는 false를 반환합니다.
 if (ret === false) {//브라우저의 기본 동작
   event.preventDefault()
   event. stopPropagation ()
    }
    }
   }
  return val;  }


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.