2012-02-07 3 views
14

Window.open (name 매개 변수없이)이 프로젝트에 흩어져 있고 이름을 지정하지 않은 경우 기본 이름을 지정하도록 구현을 변경하려고한다고 가정합니다.window.open 기능을 재정의하는 방법은 무엇입니까?

내 자신의 메서드를 window.open에 연결하면 window.open이 실행될 때마다 내 자신의 메서드가 호출되어 window.open (name 매개 변수)이 호출됩니다.

Javascript를 통해 가능합니까? 즉 window.open 함수를 호출 할 때 내 custom 함수를 호출하는 순환 종속성 문제가 발생합니까?

p.s. 간단히 말해서 내가하고 싶은 것은 window.open 기능을 오버라이드 (override)하는 것이다.

답변

26

순환 호출을 피하려면 원래 window.open 함수를 변수에 포함시켜야합니다.

글로벌 네임 스페이스를 오염시키지 않는 좋은 방법은 클로저를 사용하는 것입니다. 원래 window.open 함수를 인수로 익명 함수 (아래 open)에 전달하십시오. 이 익명 함수는 후크 함수의 팩토리입니다.

window.open = function (open) { 
    return function (url, name, features) { 
     // set name if missing here 
     name = name || "default_window_name"; 
     return open.call(window, url, name, features); 
    }; 
}(window.open); 
+0

여기에 무슨 일이 일어 났는지 설명 할 수 있습니까? 나는 JS에 정통하지 않다. 나는 두려워한다. –

+0

위의 업데이트로 설명했습니다. 나는 이것보다 더 자세한 내용을 알 수 없다고 생각한다. 나는 다음을 읽도록 권장한다 : 1. 기능 범위와 호출/적용 방법. 2. 모듈 패턴. –

+0

JS 오류가 발생했습니다. Microsoft JScript 런타임 오류 : 개체가 'call'속성 또는 메서드를 지원하지 않습니다. –

4

P.s. In simple terms what I want to do is override the window.open functionality.

var orgOpen = window.open; 

window.open = function (url, windowName, windowFeatures) { 
    alert("Overrided!"); 
    return orgOpen(url, windowName, windowFeatures); 
} 

window.open("http://www.stackoverflow.com"); 
+2

1. Pollutes global namespace. 2. 후크 기능은 인수를 사용하지 않습니다. 3. 훅 함수는 새 창 객체를 반환하지 않습니다. 4. 이것은 어떻게 작동 했습니까? –

+1

네임 스페이스 오염에 대해서는별로 신경 쓰지 않습니다. – georg

9

나는이 대답은 조금 늦게 알아,하지만 난 더 일반적인 해결책이 도움이 될 수 있다고 생각 : 귀하의 후크 기능이 영구적으로 open 인수를 통해 원래의 window.open 기능에 바인딩 다른 사람들 (다른 방법을 무효화하려고 시도)

function wrap(object, method, wrapper){ 
    var fn = object[method]; 

    return object[method] = function(){ 
     return wrapper.apply(this, [fn.bind(this)].concat(
      Array.prototype.slice.call(arguments))); 
    }; 
}; 

//You may want to 'unwrap' the method later 
//(setting the method back to the original) 
function unwrap(object, method, orginalFn){ 
    object[method] = orginalFn; 
}; 

//Any globally scoped function is considered a 'method' of the window object 
//(If you are in the browser) 
wrap(window, "open", function(orginalFn){ 
    var originalParams = Array.prototype.slice.call(arguments, 1); 
    console.log('open is being overridden'); 
    //Perform some logic 
    //Call the original window.open with the original params 
    orginalFn.apply(undefined, originalParams); 
}); 
+1

개체의 기능을 후킹하는 좋은 깨끗한 일반적인 방법 –

관련 문제