>  기사  >  웹 프론트엔드  >  FireFox._javascript 스킬에서 [이벤트 사용이 번거롭다] 문제 해결

FireFox._javascript 스킬에서 [이벤트 사용이 번거롭다] 문제 해결

WBOY
WBOY원래의
2016-05-16 19:26:59929검색

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를 구현할 수 있습니다.

아래에 간단한 코드가 나와 있으니 추가해 보세요




코드 복사


코드는 다음과 같습니다.


<script><br>if(window.addEventListener) <br>{ <br>    FixPrototypeForGecko(); <br>} <br>함수 FixPrototypeForGecko() <br>{ <br>    HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle); <br>    window.constructor.prototype.__defineGetter__("event",window_prototype_get_event); <br>    Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement); <br>} <br>function element_prototype_get_runtimeStyle() <br>{ <br>    //return style 대신... <br>    return this.style; <br>} <br>function window_prototype_get_event() <br>{ <br>    return SearchEvent(); <br>} <br>function event_prototype_get_srcElement() <br>{ <br>    return this.target; <br>} <br><br>함수 SearchEvent() <br>{ <br>    //IE <br>    if(document.all) <br>        return window.event; <br><br>    func=SearchEvent.caller; <br>    while(func!=null) <br>    { <br>        var arg0=func.arguments[0]; <br>        if(arg0) <br>        { <br>            if(arg0.constructor==Event) <br>               return arg0; <br>        } <br>        func=func.caller; <br>    } <br>    null을 반환합니다. <br>}<br></script>

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