source

JavaScript:Alert()를 덮어씁니다.

goodcode 2023. 1. 29. 20:43
반응형

JavaScript:Alert()를 덮어씁니다.

이 모든 걸 무시한 경험이 있는 사람?alert()자바스크립트로 기능합니까?

  • 어떤 브라우저가 이를 지원합니까?
  • 어떤 브라우저 버전이 이를 지원합니까?
  • 기능을 재정의할 때 어떤 위험이 있습니까?

확실히 「지원」입니다.이것은 당신의 웹페이지입니다. 당신은 그것으로 당신이 원하는 것을 할 수 있습니다.

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

프록시 패턴 사용:

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

필요에 따라서, 원래의 함수에의 콜을 바이패스 할 수도 있습니다(프록시).

자세한 내용은 이쪽: JQuery 유형 #프록시 패턴

대부분의 브라우저는 재정의 기능을 지원하지만, 이 기능을 사용할 때는 주의해야 합니다.

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

좋은 시민이 되어 네이티브 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);

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

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

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

alert('This is an override.');

다른 많은 답변에서 설명한 바와 같이 이 기능을 덮어쓸 수 있습니다.

window.alert = null

또는

window.alert = function(){}

단, 이것이 반드시 시제품의 기능을 덮어쓰는 것은 아닙니다.Window컨스트럭터(대문자 참고)W해커는 다음과 같이 입력할 수 있습니다.

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

따라서 이 기능도 다음 기능으로 덮어쓸 필요가 있습니다.

Window.prototype.alert = null

또는

Window.prototype.alert = function(){}

모든 Javascript 구현이 이를 지원할 것이며, 이와 관련된 위험은 없다고 생각합니다.보통 일반 OS 스타일의 경보 박스를 HTML/CSS로 더 우아한 것으로 교체합니다.이렇게 하면 기존 코드를 변경할 필요가 없습니다.Javascript가 가능하기 때문에 대단합니다.

라디슬라브.
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);

우선 alert() 함수에 대한 제 경험으로는 "Please register!" nag 화면을 띄우는 JavaScript 라이브러리의 트라이얼 버전을 Alert를 통해 "해킹"한 적이 있습니다.

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

테스트용일 뿐이므로 나중에 풀버전을 구입했기 때문에 부도덕한 일은 없습니다.

최신 브라우저의 모든 JavaScript 구현은 덮어쓰기를 지원합니다.

alert()와 같이 일반적으로 알려진 기능을 무시함으로써 다른 팀원을 완전히 미치게 만드는 위험은 매우 간단합니다.

따라서 기존 코드를 디버깅하거나 해킹하기 위한 도구로서의 기능을 우선하는 것이 아니라면 그렇게 할 이유가 없습니다.새 기능을 생성하기만 하면 됩니다.

파이어폭스와 ie8에서는 확실히 동작합니다.작동하지 않는 브라우저가 있을 것 같지 않아요.javascript가 네이티브 함수와 함께 사용되는 경우는 드물지만, 이것은 javascript의 작동 방법의 거의 기본입니다=)

경보 발생원을 찾기 위해 하는 빠른 해킹은 콘솔로 이동하여 이 정보를 입력하는 것입니다.

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

디폴트 메시지와 실제 경보메시지를 표시해야 하는 상황에 직면했습니다.이렇게 해서 겨우 해냈다.


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

크롬으로 테스트했습니다.그것이 좋은 실천인지는 잘 모르겠지만 목적에 부합한다.

는 js 브라우저 함수window.alert은 JS를 안다alert()--현재 사용 중인 모든 브라우저에서 지원되며 코드 스니펫도 지원됩니다.그러나 오버라이드하지 않습니다(OOP의 의미에서는 오버라이드라기보다는 리팩터링에 가깝습니다).alert()가 있는 할 수 있습니다.왜냐하면 실제로 사용할 필요가 있는 경우alert()템플릿이 없기 때문에 아마 그럴 것입니다.그러려면 다른 비템플릿 기능이 필요합니다.

언급URL : https://stackoverflow.com/questions/1729501/javascript-overriding-alert

반응형