JavaScript: Geçersiz kılma uyarısı ()


207

alert()JavaScript'teki işlevi geçersiz kılma konusunda herhangi bir deneyimi olan var mı?

  • Hangi tarayıcılar bunu destekliyor?
  • Hangi tarayıcı sürümleri bunu destekliyor?
  • İşlevi geçersiz kılmanın tehlikeleri nelerdir?

Bu sonsuz bir döngü değil mi?
Havuz

1
@Nick - hayır, değil. Window._alert'e 'normal' window.alert işlevi atanacaktır. > <Sonra window.alert işlevi yeniden tanımlanır.
Chris,

@roosteronacid: @ paper1337'nin işaret ettiği gibi, kodunuz anlamsal ve sözdizimsel olarak inceydi ... orada tekrarlama şansı yok ... aslında ilk olarak fonksiyon gövdelerini bir çeşit genleşme sıcaklığı olarak değiştirdiniz . _alert
sıralayıcı olmayan

Evet. Soruyu gizlememek için bir geri alma yaptım :)
cllpse

Yanıtlar:


210

Kesinlikle "desteklenir". Bu sizin web sayfanızdır, onunla ne yapmak isterseniz yapın.

Bunu, bir kütüphaneyi değiştirmeden ancak etkinliklere gizleyerek analiz etkinliklerini izlemek için zaten yaptım.

Proxy desenini kullanın:

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

İsterseniz aramayı orijinal işleve atlayabilirsiniz (proxy)

Daha fazla bilgi burada: JQuery Türleri # Proxy Desen


İçin proxy şablonunda +1 gerçekten fonk geçersiz kılmak ve onu tahrif almaz sağlamak!
Josh Stodola

15
Ihh! Internet Explorer 8'de apply()kullanılamıyor window.alert.
cllpse

Bunu duyduğuma üzüldüm .. nesnenin applybir yöntemi Function. Bu yüzden açıkçaalert mı?
Mike Gleason jr Couturier

4
Proxy modelini kullanarak bunu geçersiz kılmış olmalılar: D
Josh Stodola

Eski tarayıcılar bunu desteklemez ve "window.alert ="
Chris Pietschmann

23

Tarayıcıların çoğu geçersiz kılmayı desteklese de, onunla ne yaptığınıza dikkat edin.

Varsayılan uyarı kutusu yürütme iş parçacığını engellediğinden, bu davranışa dayanan bazı kitaplıklar artık çalışmayabilir (en iyi ihtimalle).

İyi bir vatandaş olmanız ve yerel API'ya dokunmaktan kaçınmanız gerekir. Bunu yaparsanız, 3. taraf kodunu kullanırken işleri bozabilirsiniz.

Ancak, uyarı davranışını belirli bir bağlamda yeniden tanımlamak istiyorsanız, bunu anonim bir işlevle kapatabilirsiniz:

/* 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

Overring alert fonksiyonunda tehlike yoktur. Her tarayıcı bunu destekler.

Örneğin:

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

alert('This is an override.');

11
Orada olabilir Değişim tıkanmasızdır ise tehlike oluşturuyor. Örneğin alert("Reloading"), web sayfasını çağıran ve sonra yeniden yükleyen kod . Uyarı metni asla kullanıcı tarafından görülmeyebilir.
Darien

13

Her Javascript uygulamasının bunu destekleyeceğini düşünüyorum ve bununla ilgili bir tehlike yok. Genellikle işletim sistemi tarzındaki düz uyarı kutularını HTML / CSS ile daha zarif bir şeye değiştirmek için yapılır. Bu şekilde yapmak, mevcut kodu değiştirmek zorunda olmadığınız anlamına gelir! Mümkün olduğu için Javascript harika.


12

Diğer cevapların çoğunda söylendiği gibi, fonksiyonu sadece

window.alert = null

veya

window.alert = function(){}

ancak, bu mutlaka Windowyapıcı prototipindeki işlevi geçersiz kılmaz (büyük harf not edin W), böylece bilgisayar korsanı hala şunu yazabilir:

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

bu nedenle, bu işlevi şu şekilde geçersiz kılmanız gerekir:

Window.prototype.alert = null

veya

Window.prototype.alert = function(){}

Bu, diğer karelerdeki işlevi geçersiz kılmak zorunda değildir. bkz. jsfiddle.net/18znqbjd/1
Robert

Robert: Evet ve iyi nedenlerle. Farklı çerçeveler temel olarak her biri kendi Javascript "örneğine" sahip farklı HTML belgeleridir.
Rolf

Window.prototype.alert'in 2017'de hala bir işlev olduğundan emin misiniz? : P
iplus26

6

Ladislav.
IE8 için alert () yöntemini bu şekilde yeniden tanımlayabilirsiniz

/** 
 * 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);

ve olarak ara

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

4

Uyarı () işlevini geçersiz kılma deneyimim, bir keresinde "Lütfen kayıt olun!" Görüntülenen JavaScript kitaplığının deneme sürümünü "kesmek" için kullandığımızdır. nag ekranını zaman zaman uyarı ile.

Biz sadece kendi alert () fonksiyonumuzu ve voila'mızı tanımladık.

Sadece test amaçlıydı, daha sonra tam sürümünü aldık, bu yüzden burada ahlaksız hiçbir şey yok ;-)


3

Modern tarayıcılardaki tüm JavaScript uygulamaları geçersiz kılmayı destekler.

Tehlikeler oldukça basittir, alert () gibi yaygın olarak bilinen işlevleri geçersiz kılarak diğer ekip üyelerini kesinlikle çıldırtırsınız.

Bu nedenle, mevcut kodu bir şekilde hata ayıklamak veya kesmek için bir araç olarak işlevleri geçersiz kılmadığınız sürece, bunu yapmak için herhangi bir neden görmüyorum. Sadece yeni bir işlev oluşturun.


2

Firefox ve ie8'de çalıştığından emin. Çalışmayacağı herhangi bir tarayıcı olacağını göremiyorum. Bu, çoğu zaman böyle yerel işlevlerle kullanıldığını görmese bile, javascript'in nasıl çalıştığının hemen hemen temelidir.


1
Özellikle hedeflemek için Tarayıcı IE6 diğerleri olurdu muhtemelen onunla ok.
AnthonyWJones

1

Uyarıların nereden geldiğini bulmak için yaptığım hızlı bir kesmek, konsola gidip buna girmek.

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

0

Js tarayıcı işlevleri söz konusu olduğunda window.alert, en iyi bilinen ve en iyi bilinen, js bilmeyen insanlar alert()- bugün kullanılan tüm tarayıcılarda desteklendiğinden ve kod snippet'inizin de olduğundan emin olabilirsiniz. Ancak, alert()sizin gibi belirli bir kullanım durumu için geçersiz kılmayacağım (bu daha çok OOP anlamında geçersiz kılmak yerine yeniden düzenleme gibi) çünkü alert()şablon olmadan kullanmanız gerektiğinde ve muhtemelen, başka bir uyarı olmayan işlev.


0

Gerçek uyarı mesajlarıyla birlikte varsayılan bir mesaj gösterme gereksinimi ile karşılaştım. Ben böyle yapmayı başardım.


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

Krom üzerinde test ettim. İyi bir uygulama olup olmadığından emin değilim, ama amaca hizmet ediyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.