JavaScript : alert () 재정의
alert()
JavaScript로 함수 를 재정의 한 경험이 있습니까?
- 어떤 브라우저가이를 지원합니까?
- 어떤 브라우저 버전이이를 지원합니까?
- 함수를 재정의 할 때 어떤 위험이 있습니까?
확실히 "지원"됩니다. 그것은 당신의 웹 페이지이며, 당신이 원하는 것은 무엇이든합니다.
이미 라이브러리를 수정하지 않고 이벤트를 몰래 분석 이벤트를 추적하기 위해이 작업을 수행했습니다.
프록시 패턴을 사용하십시오.
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
원하는 경우 원래 기능에 대한 호출을 무시할 수도 있습니다 (프록시).
더 많은 정보는 여기에 : JQuery Types #Proxy Pattern
대부분의 브라우저는 재정의를 지원하지만 사용중인 작업에주의하십시오.
기본 경고 상자가 실행 스레드를 차단하므로이 동작에 의존하는 일부 라이브러리는 더 이상 작동하지 않을 수 있습니다.
당신은 좋은 시민이어야하고 네이티브 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.');
나는 모든 자바 스크립트 구현이 이것을 지원할 것이라고 생각하며, 그와 관련된 위험은 없습니다. 일반적으로 일반 OS 스타일의 경고 상자를 HTML / CSS와 함께보다 우아한 것으로 대체합니다. 이 방법으로 기존 코드를 변경할 필요가 없습니다! 가능하다는 사실은 Javascript를 최고로 만듭니다.
다른 많은 답변에서 언급했듯이 함수를 재정의 할 수 있습니다.
window.alert = null
또는
window.alert = function(){}
however, this doesn't necessarily override the function on the prototype of the Window
constructor (note the capital W
), so the hacker can still type:
Window.prototype.alert.apply(window, ["You were hacked!"]);
therefore, you also need to override that function with:
Window.prototype.alert = null
or
Window.prototype.alert = function(){}
Ladislav.
For IE8 you can redefine alert() like this way
/**
* 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);
and call as
alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);
My experience with overriding alert() function is that we once used it to "hack" trial version of JavaScript library that displayed "Please register!" nag screen through alert time to time.
We just defined our own alert() function and voila.
It was for testing purposes only, we bought full version later, so nothing immoral going on here ;-)
All JavaScript implementations in modern browsers support overriding.
The dangers are quite simply, that you would drive other team members absolutely crazy by overriding commonly known functions such as alert().
So unless you are overriding functions as a tool to perhaps debug or hack existing code in some way, I don't see any reason to do it. Just create a new function.
It sure works in firefox and ie8. I can't see that there'd be any browser it wouldn't work in. This is pretty much fundamental of how javascript works, even though one don't often see it used with native functions like that =)
A quick hack that I do to find where the alerts are coming from, is to go to console and then enter this
function alert(message) {
console.info(message);
debugger;
}
js 브라우저 기능 window.alert
은 눈에 잘 띄고 가장 잘 알려져 있습니다 .js를 모르는 사람들은 js를 알고 있습니다. 오늘 사용중인alert()
모든 브라우저 에서 지원되며 코드 스 니펫도 확실합니다 . 그러나 alert()
특정 유스 케이스의 경우 ( OOP 의미에서 재정의하는 것이 아니라 리팩토링과 비슷합니다) alert()
템플릿 을 사용 하지 않고 실제로 사용해야 할 때 필요합니다. 그렇게하는 또 다른 경고 기능이 없습니다.
참고 URL : https://stackoverflow.com/questions/1729501/javascript-overriding-alert
'IT story' 카테고리의 다른 글
시스템 트레이에서만 실행되는 .NET Windows Forms 응용 프로그램을 만들려면 어떻게해야합니까? (0) | 2020.05.06 |
---|---|
범프 버전은 무엇을 의미합니까? (0) | 2020.05.06 |
<% $, <% @, <% =, <% #… 거래는 무엇입니까? (0) | 2020.05.06 |
C #에서 C ++ 스타일의 'friend'키워드를 제공하지 않는 이유는 무엇입니까? (0) | 2020.05.06 |
Java Swing revalidate () vs repaint () (0) | 2020.05.06 |