> 웹 프론트엔드 > JS 튜토리얼 > FireFox_javascript 스킬에서 [이벤트 사용이 번거롭다] 문제 해결

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-05-16 19:23:56
원래의
936명이 탐색했습니다.

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()
{
func=SearchEvent.caller; func!=null)
{
var arg0 =func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event) // 이벤트 개체
return arg0;        }
func=func.caller;
}
return null;
}
이 예에서는 'Event'를 검색합니다. FireFox의 event.constructor입니다.
이 예에서
SearchEvent.caller는 showcontent이지만 showcontent.arguments[0]은 비어 있습니다. 따라서 func=func.caller이면 func는
handle_click이 됩니다. FireFox에 의해 호출됩니다. 매개변수는 정의되어 있지 않지만 호출 시 첫 번째 매개변수가 이벤트이므로 handler_click.arguments[0]은 이벤트입니다!

위의 지식을 바탕으로 프로토타입을 결합할 수 있습니다. FireFox에서 window.event를 구현하기 위한 __defineGetter__:

아래에 간단한 코드가 제공됩니다. 관심이 있으시면 추가하실 수 있습니다.

if(window.addEventListener)
{
FixPrototypeForGecko();
}
function FixPrototypeForGecko ()
{
HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle)
window.constructor.prototype.__defineGetter__("event", window_prototype_get_event);
Event.prototype.__defineG etter__(" SRCELEMENT ", Event_prototype_get_Srcelement);
}
함수 Element_prototype_Get_runtimestyle ()
{
// 대신 스타일 반환 ...
반환 this.style;
}
함수 window_prototype_get_event( )
{
return SearchEvent();
}
function event_prototype_get_srcElement()
{
return this.target;
}

함수 SearchEvent()
{
    //IE
    if(document.all)
        return window.event;

    func=SearchEvent.caller;
    while(func!=null)
    {
        var arg0=func.arguments[0];
        if(arg0)
        {
            if(arg0.constructor==Event)
               return arg0;
        }
        func=func.caller;
    }
    null을 반환합니다.
}

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿