JavaScript: Peringatan utama ()

207

Adakah yang punya pengalaman dengan mengesampingkan alert()fungsi dalam JavaScript?

  • Browser mana yang mendukung ini?
  • Versi browser apa yang mendukung ini?
  • Apa bahaya dalam mengesampingkan fungsi?
cllpse
sumber
Apakah itu bukan loop tak terbatas?
Pool
1
@Nick - tidak, tidak. Fungsi window.alert 'normal' akan ditugaskan ke window._alert. > Setelah <bahwa fungsi window.alert didefinisikan ulang.
Chris Shouts,
@roosteronacid: Kode Anda secara semantik dan sintaksis baik-baik saja, meskipun dibuat-buat, seperti yang ditunjukkan oleh @ paper1337 ... tidak ada peluang rekursi di sana lol ... pada dasarnya Anda baru saja menukar fungsi-fungsi dengan _alertsebagai semacam expo temp pada contoh pertama.
non sequitor
Iya. Saya melakukan roll-kembali engkau, untuk tidak mengaburkan pertanyaan :)
cllpse

Jawaban:

210

Ini pasti "didukung". Ini adalah halaman web Anda, Anda melakukan apa pun yang Anda inginkan dengannya.

Saya sudah melakukan ini untuk melacak acara analitik tanpa memodifikasi perpustakaan tetapi dengan menyelinap masuk ke acara.

Gunakan pola proxy:

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

Anda juga dapat mem-bypass panggilan ke fungsi semula jika Anda mau (proksi)

Info lebih lanjut di sini: Jenis JQuery #Proxy Pattern

Mike Gleason jr Couturier
sumber
Memberi +1 pada pola proksi untuk benar - benar mengesampingkan func dan memastikannya tidak dirusak!
Josh Stodola
15
Ugh! apply()tidak tersedia di window.alertdalam Internet Explorer 8.
cllpse
Maaf mendengarnya .. applyadalah metode Functionobjek. Jadi mereka harus secara eksplisit membatasi itu alert?!
Mike Gleason jr Couturier
4
Mereka pasti menimpanya menggunakan pola proxy: D
Josh Stodola
Peramban yang lebih lama tidak mendukung ini dan akan memberikan pengecualian pada "window.alert ="
Chris Pietschmann
23

Meskipun sebagian besar browser mendukungnya, berhati-hatilah dengan apa yang Anda lakukan dengannya.

Karena kotak peringatan default memblokir utas eksekusi, beberapa pustaka yang mengandalkan perilaku ini mungkin tidak berfungsi lagi (paling-paling).

Anda harus menjadi warga negara yang baik dan menghindari menyentuh API asli. Jika ya, Anda bisa memecahnya, saat menggunakan kode pihak ke-3.

Namun, jika Anda ingin mendefinisikan kembali perilaku waspada dalam konteks tertentu, Anda bisa melampirkannya dengan fungsi anonim, seperti ini:

/* 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);
Pablo Cabrera
sumber
15

Tidak ada bahaya dalam fungsi peringatan Overring. Setiap browser mendukungnya.

sebagai contoh:

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

alert('This is an override.');
pengguna160820
sumber
11
Ada bisa menjadi bahaya jika pengganti Anda nonblocking. Misalnya, kode panggilan mana yang alert("Reloading")kemudian memuat ulang halaman web. Teks peringatan mungkin tidak pernah terlihat oleh pengguna.
Darien
13

Saya pikir setiap implementasi Javascript akan mendukung ini, dan tidak ada bahaya yang terlibat dengannya. Ini biasanya dilakukan untuk mengganti kotak peringatan bergaya OS ke sesuatu yang lebih elegan dengan HTML / CSS. Melakukannya dengan cara ini berarti Anda tidak perlu mengubah kode yang ada! Fakta bahwa itu memungkinkan membuat Javascript luar biasa.

Josh Stodola
sumber
12

Seperti yang dikatakan dalam banyak jawaban lain, Anda bisa mengganti fungsi dengan

window.alert = null

atau

window.alert = function(){}

Namun, ini tidak serta-merta mengesampingkan fungsi prototipe Windowkonstruktor (perhatikan modal W), sehingga peretas masih dapat mengetik:

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

karena itu, Anda juga perlu mengganti fungsi itu dengan:

Window.prototype.alert = null

atau

Window.prototype.alert = function(){}
Mendongkrak
sumber
Ini tidak selalu mengesampingkan fungsi dalam bingkai lain. lihat jsfiddle.net/18znqbjd/1
Robert
Robert: Ya dan untuk alasan yang bagus. Frame yang berbeda pada dasarnya adalah dokumen HTML yang berbeda, masing-masing dengan "contoh" Javascript sendiri.
Rolf
Anda yakin Window.prototype.alert masih berfungsi di 2017? : P
iplus26
6

Ladislav.
Untuk IE8 Anda dapat mendefinisikan ulang peringatan () seperti ini

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

dan panggil sebagai

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

Pengalaman saya dengan fungsi peringatan utama () adalah bahwa kami pernah menggunakannya untuk "meretas" versi percobaan perpustakaan JavaScript yang menampilkan "Silakan daftar!" cerewet layar melalui waktu peringatan ke waktu.

Kami baru saja mendefinisikan fungsi alert () kami dan voila.

Itu hanya untuk tujuan pengujian, kami membeli versi lengkap nanti, jadi tidak ada yang tidak bermoral terjadi di sini ;-)

Josef Sábl
sumber
3

Semua implementasi JavaScript di browser modern mendukung penggantian.

Bahayanya cukup sederhana, bahwa Anda akan membuat anggota tim lain benar-benar gila dengan mengesampingkan fungsi yang umum dikenal seperti waspada ().

Jadi, kecuali jika Anda mengesampingkan fungsi sebagai alat untuk mungkin men-debug atau meretas kode yang ada dalam beberapa cara, saya tidak melihat alasan untuk melakukannya. Cukup buat fungsi baru.

Christopher Tokar
sumber
2

Itu pasti berfungsi di firefox dan ie8. Saya tidak dapat melihat bahwa akan ada peramban yang tidak berfungsi. Ini cukup mendasar tentang cara kerja javascript, meskipun orang tidak sering melihatnya menggunakan fungsi asli seperti itu =)

David Hedlund
sumber
1
Browser yang akan ditargetkan secara spesifik adalah IE6 dan yang lainnya mungkin akan setuju.
AnthonyWJones
1

Peretasan cepat yang saya lakukan untuk menemukan dari mana peringatan itu berasal, adalah pergi ke konsol dan kemudian masukkan ini

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

Ketika datang ke fungsi browser js window.alertadalah unggulan dan paling terkenal, orang yang tidak tahu js tahu alert()- yakin itu didukung di semua browser yang digunakan hari ini dan potongan kode Anda juga. Namun, saya tidak akan menimpa (nah ini lebih seperti refactoring daripada menimpa dalam arti OOP) alert()untuk kasus penggunaan tertentu karena Anda karena ketika Anda benar-benar perlu menggunakan alert()tanpa template, dan Anda mungkin akan melakukannya, maka Anda akan perlu fungsi non-waspada lain untuk melakukannya.

bukan sequitor
sumber
0

Saya telah menghadapi persyaratan untuk menampilkan pesan default beserta pesan peringatan yang sebenarnya. Beginilah cara saya berhasil melakukannya.


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

Saya sudah mengujinya di chrome. Saya tidak yakin apakah ini praktik yang baik, tetapi melayani tujuannya.

Badri nath
sumber