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; }