JavaScript : alert () 재정의


207

alert()JavaScript로 함수 를 재정의 한 경험이 있습니까?

  • 이를 지원하는 브라우저는 무엇입니까?
  • 어떤 브라우저 버전이이를 지원합니까?
  • 함수를 재정의 할 때 어떤 위험이 있습니까?

그것은 무한 루프가 아닙니까?
수영장

1
@ 닉-아니, 그렇지 않습니다. 'normal'window.alert 함수는 window._alert에 할당됩니다. > After <window.alert 함수가 재정의되었습니다.
Chris Shouts

@roosteronacid : 코드는 의미이고 구문 미세하지만 ... 재귀없이 기회가 ... 롤 본질적으로 당신이 방금 지적 @ paper1337으로, 인위적인 교체 와 기능기구 _alert의 종류 등 의 expando 첫 번째 인스턴스에서 온도를.
non sequitor

찬성. 나는 질문을 모호하게하지 않기 위해 롤백을했다 :)
cllpse

답변:


210

확실히 "지원"됩니다. 그것은 당신의 웹 페이지이며, 당신이 원하는 것은 무엇이든합니다.

이미 라이브러리를 수정하지 않고 이벤트를 몰래 분석 이벤트를 추적하기 위해이 작업을 수행했습니다.

프록시 패턴을 사용하십시오.

(function(proxied) {
  window.alert = function() {
    // do something here
    return proxied.apply(this, arguments);
  };
})(window.alert);

원하는 경우 원래 기능에 대한 호출을 무시할 수도 있습니다 (프록시).

자세한 정보는 여기 : JQuery 유형 # 프록시 패턴


프록시 패턴을 +1 하여 기능 을 실제로 재정의하고 변경되지 않도록하십시오!
Josh Stodola

15
어! Internet Explorer 8 apply()에서는 사용할 수 없습니다.window.alert
cllpse

유감입니다 .. 객체 apply의 방법입니다 Function. 그래서 그들은 그것을 명시 적으로 제한해야 alert합니까?!
Mike Gleason jr Couturier

4
그들은 프록시 패턴을 사용하여 대체해야했습니다 : D
조쉬 Stodola에게

오래된 브라우저는이를 지원하지 않으며 "window.alert ="
Chris Pietschmann에서

23

대부분의 브라우저는 재정의를 지원하지만 사용중인 작업에주의하십시오.

기본 경고 상자가 실행 스레드를 차단하므로이 동작에 의존하는 일부 라이브러리는 더 이상 작동하지 않을 수 있습니다.

당신은 좋은 시민이어야하고 네이티브 API를 건드리지 마십시오. 그렇게하면 타사 코드를 사용할 때 문제가 발생할 수 있습니다.

그러나 특정 상황에서 경고 동작을 재정의하려면 다음과 같이 익명 함수로 경고 동작을 묶을 수 있습니다.

/* new funky alert */
function myFunkyAlert(msg) { 
    /* here goes your funky alert implementation */
    alert("Look ma!\n" + msg);
}

(function(alert) { // anonymous function redefining the "alert"

    /* sample code */
    alert("Hello World!");

})(myFunkyAlert);

15

경고 경고 기능에는 위험이 없습니다. 모든 브라우저가이를 지원합니다.

예를 들면 다음과 같습니다.

// function over riding. Redirecting to Console with Firebug installed.
function alert(message) { 
    console.info(message);
} 

alert('This is an override.');

11
교체가 블로킹 경우 위험합니다. 예를 들어, alert("Reloading")웹 페이지 를 호출 한 다음 다시로드하는 코드입니다 . 경고 텍스트가 사용자에게 표시되지 않을 수 있습니다.
Darien

13

모든 Javascript 구현이이를 지원할 것이라고 생각하며 관련된 위험은 없습니다. 일반적으로 일반 OS 스타일의 경고 상자를 HTML / CSS와 함께보다 우아한 것으로 대체합니다. 이렇게하면 기존 코드를 변경할 필요가 없습니다! 가능하다는 사실은 Javascript를 최고로 만듭니다.


12

다른 많은 답변에서 언급했듯이 함수를 재정의 할 수 있습니다.

window.alert = null

또는

window.alert = function(){}

그러나 이것은 Window생성자 의 프로토 타입 (자본에주의하십시오 W) 의 함수를 반드시 재정의 할 필요는 없으므로 해커는 여전히 다음을 입력 할 수 있습니다.

Window.prototype.alert.apply(window, ["You were hacked!"]);

따라서 다음을 사용하여 해당 기능을 재정의해야합니다.

Window.prototype.alert = null

또는

Window.prototype.alert = function(){}

다른 프레임의 함수를 반드시 재정의 할 필요는 없습니다. jsfiddle.net/18znqbjd/1
Robert

Robert : 그렇습니다. 서로 다른 프레임은 기본적으로 서로 다른 HTML 문서이며, 각각 고유 한 "인스턴스"Javascript가 있습니다.
Rolf

Window.prototype.alert가 여전히 2017 년의 기능입니까? : P
iplus26

6

라디 슬라 프.
IE8의 경우 다음과 같이 alert ()을 재정의 할 수 있습니다

/** 
 * Definition of global attached to window properties <br/>
 */ 
    (function() {
      nalert = window.alert;
      Type = {
          native: 'native',
          custom: 'custom'
      };
    })();

/**
 * Factory method for calling alert(). 
 * It will be call a native alert() or a custom redefined alert() by a Type param.
 * This defeinition need for IE
 */ 
    (function(proxy) {

          proxy.alert = function () {
          var message = (!arguments[0]) ? 'null': arguments[0];
          var type = (!arguments[1]) ? '': arguments[1];

          if(type && type == 'native') {
           nalert(message);
          }
          else {
               document.write('<h1>I am redefiend alert()<br/>Alert say: '+message+'</h1>');
          }     
      };
   })(this);

로 전화

alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);

4

alert () 함수를 재정의 한 경험은 "등록하십시오!"라는 JavaScript 라이브러리의 평가판을 "해킹"하는 데 사용한 적이 있다는 것입니다. 경고 시간을 통해 화면을 비 웁니다.

방금 자체 alert () 함수와 voila를 정의했습니다.

테스트 목적으로 만 사용되었으며 나중에 정식 버전을 구입했기 때문에 부도덕 한 일이 없습니다. ;-)


3

최신 브라우저의 모든 JavaScript 구현은 재정의를 지원합니다.

alert ()과 같이 일반적으로 알려진 기능을 재정 의하여 다른 팀 구성원을 완전히 미치게 할 위험은 매우 간단합니다.

따라서 어떤 식 으로든 기존 코드를 디버깅하거나 해킹하는 도구로 함수를 재정의하지 않는 한 그렇게 할 이유가 없습니다. 새로운 기능을 만드십시오.


2

파이어 폭스와 ie8에서 작동합니다. 작동하지 않는 브라우저가 있다는 것을 알 수 없습니다. 이것은 자바 스크립트가 작동하는 방법의 근본입니다.


1
구체적으로 타겟팅 할 브라우저는 IE6 일 것이고 다른 브라우저는 괜찮을 것입니다.
AnthonyWJones

1

경고의 출처를 찾기 위해 수행하는 빠른 해킹은 콘솔로 이동 한 다음이를 입력하는 것입니다.

function alert(message) { 
  console.info(message);
  debugger;
} 

0

js 브라우저 기능 window.alert은 두드러지고 가장 잘 알려져 있습니다 .js를 모르는 사람들은 js를 알고 있습니다. 오늘 사용중인alert() 모든 브라우저 에서 지원되며 코드 스 니펫도 확실합니다 . 그러나 alert()특정 유스 케이스의 경우 ( OOP 의미에서 재정의하는 것이 아니라 리팩토링과 비슷합니다) alert()템플릿 을 사용 하지 않고 실제로 사용해야 할 때 필요합니다. 이를위한 또 다른 경고 기능이 없습니다.


0

실제 경고 메시지와 함께 기본 메시지를 표시 해야하는 요구 사항에 직면했습니다. 이것이 내가 관리하는 방법입니다.


    const actualAlertFunc = window.alert;
    window.alert = function(msg) {
         actualAlertFunc('some default message '+ msg);
    }

크롬에서 테스트했습니다. 나는 그것이 좋은 실천인지 확실하지 않지만 목적에 기여한다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.