FireFox에서 이벤트 처리 함수를 작성하는 것은 매우 번거롭습니다.
FireFox에는 window.event가 없기 때문에 이벤트 객체를 얻으려면 시간 처리 함수의 첫 번째 매개변수를 event로 선언해야 합니다. >따라서 IE 및 FireFox와 호환되기 위한 일반적인 이벤트 처리 방법은 다음과 같습니다.
btn.onclick=handle_btn_click
function handler_btn_click(evt)
{
if(evt==null) evt=window.event;//IE
//이벤트를 처리합니다.
}
간단한 프로그램의 경우에는 문제가 되지 않습니다.
그러나 일부 복잡한 프로그램의 경우 특정 함수를 작성하는 것은 전혀 간단하지 않습니다. 이벤트에 연결되어 있으므로 이 매개변수에 이벤트를 전달하려면 모든 메서드에서 이벤트를 앞뒤로 전달해야 합니다.
다음은 방법입니다.
JScript에서 함수 호출에는 func.caller 속성이 있습니다.
예:
function A()
{
B();
}
function B()
{
Alert(B.caller)
}
A가 B를 호출하면 B.caller는 A입니다
또한 함수에는 인수 속성이 있습니다. 이 속성은 함수의 현재 실행 매개변수를 순회할 수 있습니다.
function myalert()
{
var arr=[]
for( var i=0;i arr[i]= myalert.arguments[i];
Alert(arr.join("-"))
}
alert("hello","world", 1,2,3)
hello-world-1-2-3 표시
(인수 개수는 호출자와 관련이 있으며 함수의 매개변수 정의와는 아무런 관련이 없습니다)
이 두 속성에 따라 함수의 첫 번째 이벤트 개체를 가져올 수 있습니다.
btn.onclick=handle_click;
function handler_click()
{
showcontent()
}
function showcontent()
{
var evt=SearchEvent();
if(evt&&evt.shiftKey)//이벤트 기반 호출이고 Shift 키를 누른 경우
window.open( global_helpurl);
else
location.href=global_helpurl;
}
function SearchEvent()
{
while(func!=null)
{
var arg0=func.args[0];
if(arg0)
}
func=func .caller;
}
}
이 예에서는 SearchEvent를 사용하여 이벤트 개체를 검색합니다. 여기서 'Event'는 FireFox의 event.constructor입니다.
이 예를 실행하면
SearchEvent.caller는 showcontent이지만 showcontent.arguments[0]은 따라서 func=func.caller일 때 func는
handle_click이 FireFox에 의해 호출됩니다. 비록 매개변수가 정의되어 있지 않지만 호출되면 첫 번째 매개변수는 이벤트이므로
위의 지식을 바탕으로 프로토타입.__defineGetter__를 결합하여 FireFox에서 window.event를 구현할 수 있습니다.
아래에 간단한 코드가 나와 있으니 추가해 보세요
코드 복사
코드는 다음과 같습니다.