JavaScript: Cảnh báo ghi đè ()


207

Có ai có bất kỳ kinh nghiệm nào về việc ghi đè alert()hàm trong JavaScript không?

  • Những trình duyệt nào hỗ trợ điều này?
  • Phiên bản trình duyệt nào hỗ trợ điều này?
  • Những nguy hiểm trong việc ghi đè chức năng là gì?

Đó không phải là một vòng lặp vô hạn?
Bể bơi

1
@Nick - không, không phải vậy. Hàm window.alert 'bình thường' sẽ được gán cho window._alert. > Sau khi <rằng hàm window.alert được xác định lại.
Chris hét lên

@roosteronacid: Mã của bạn rất tốt về mặt ngữ nghĩa và cú pháp, mặc dù đã được sử dụng, như @ paper1337 chỉ ra ... không có cơ hội đệ quy ở đó lol ... về bản chất, bạn chỉ trao đổi các cơ quan chức năng _alertnhư một loại temp mở rộng trong trường hợp đầu tiên.
không trình tự

Đúng vậy Tôi đã quay lại, để không làm lu mờ câu hỏi :)
cllpse

Câu trả lời:


210

Nó chắc chắn "được hỗ trợ". Đây là trang web của bạn, bạn làm bất cứ điều gì bạn muốn với nó.

Tôi đã làm điều này để theo dõi các sự kiện phân tích mà không sửa đổi thư viện nhưng bằng cách lẻn vào các sự kiện.

Sử dụng mẫu proxy:

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

Bạn cũng có thể bỏ qua cuộc gọi đến chức năng ban đầu nếu bạn muốn (ủy nhiệm)

Thông tin thêm ở đây: Kiểu JQuery #Proxy Pattern


+1 trên mẫu proxy để thực sự ghi đè func và đảm bảo nó không bị giả mạo!
Josh Stodola

15
Ừ! apply()không khả dụng trên window.alertInternet Explorer 8.
cllpse

Tôi rất tiếc khi biết rằng .. applylà một phương pháp của Functionđối tượng. Vì vậy, họ phải rõ ràng hạn chế nó cho alert?!
Mike Gl lý do jout Couturier

4
Họ phải ghi đè nó bằng mẫu proxy: D
Josh Stodola

Các trình duyệt cũ hơn không hỗ trợ điều này và sẽ đưa ra một ngoại lệ trên "window.alert ="
Chris Pietschmann

23

Mặc dù hầu hết các trình duyệt đều hỗ trợ ghi đè lên nó, hãy cẩn thận với những gì bạn đang làm với nó.

Vì hộp cảnh báo mặc định chặn luồng thực thi, một số thư viện dựa trên hành vi này có thể không hoạt động nữa (tốt nhất).

Bạn nên là một công dân tốt và tránh chạm vào API gốc. Nếu bạn làm như vậy, bạn có thể phá vỡ mọi thứ, khi sử dụng mã bên thứ 3.

Tuy nhiên, nếu bạn muốn xác định lại hành vi cảnh báo trong một ngữ cảnh cụ thể, bạn có thể đặt nó với một chức năng ẩn danh, như thế này:

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

Không có nguy hiểm trong chức năng cảnh báo Overring. Mọi trình duyệt đều hỗ trợ nó.

ví dụ:

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

alert('This is an override.');

11
thể có một mối nguy hiểm nếu sự thay thế của bạn là không chặn. Ví dụ: mã gọi alert("Reloading")và sau đó tải lại trang web. Văn bản cảnh báo có thể không bao giờ được nhìn thấy bởi người dùng.
Darien

13

Tôi nghĩ rằng mọi triển khai Javascript sẽ hỗ trợ điều này và không có nguy hiểm liên quan đến nó. Nó thường được thực hiện để thay thế các hộp cảnh báo kiểu OS đơn giản thành một thứ thanh lịch hơn với HTML / CSS. Làm theo cách này có nghĩa là bạn không phải thay đổi mã hiện có! Thực tế là nó có thể làm cho Javascript tuyệt vời.


12

Như đã nói trong nhiều câu trả lời khác, bạn chỉ có thể ghi đè hàm bằng

window.alert = null

hoặc là

window.alert = function(){}

tuy nhiên, điều này không nhất thiết ghi đè chức năng trên nguyên mẫu của hàm Windowtạo (lưu ý vốn W), do đó, hacker vẫn có thể gõ:

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

do đó, bạn cũng cần ghi đè chức năng đó bằng:

Window.prototype.alert = null

hoặc là

Window.prototype.alert = function(){}

Điều này không nhất thiết phải ghi đè chức năng trong các khung khác. xem jsfiddle.net/18znqbjd/1
Robert

Robert: Vâng và vì lý do tốt. Các khung khác nhau về cơ bản là các tài liệu HTML khác nhau, mỗi tài liệu có "ví dụ" Javascript riêng.
Rolf

Bạn có chắc chắn Window.prototype.alert vẫn là một chức năng trong năm 2017? : P
iplus26

6

Ladislav.
Đối với IE8, bạn có thể xác định lại cảnh báo () như cách này

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

và gọi như

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

4

Kinh nghiệm của tôi với chức năng cảnh báo ghi đè () là chúng tôi đã từng sử dụng nó để "hack" phiên bản dùng thử của thư viện JavaScript hiển thị "Vui lòng đăng ký!" màn hình nag qua cảnh báo thời gian.

Chúng ta chỉ định nghĩa hàm alert () và voila của riêng mình.

Nó chỉ dành cho mục đích thử nghiệm, chúng tôi đã mua phiên bản đầy đủ sau đó, vì vậy không có gì vô đạo đức xảy ra ở đây ;-)


3

Tất cả các triển khai JavaScript trong các trình duyệt hiện đại đều hỗ trợ ghi đè.

Các mối nguy hiểm khá đơn giản, rằng bạn sẽ khiến các thành viên khác trong nhóm phát điên hoàn toàn bằng cách ghi đè các chức năng thường được biết đến như cảnh báo ().

Vì vậy, trừ khi bạn ghi đè các chức năng như một công cụ để có thể gỡ lỗi hoặc hack mã hiện có theo một cách nào đó, tôi không thấy bất kỳ lý do nào để làm điều đó. Chỉ cần tạo một chức năng mới.


2

Nó chắc chắn hoạt động trong firefox và eg8. Tôi không thể thấy rằng sẽ có bất kỳ trình duyệt nào nó không hoạt động. Đây là phần cơ bản của cách javascript hoạt động, mặc dù người ta thường không thấy nó được sử dụng với các chức năng gốc như thế =)


1
Trình duyệt để nhắm mục tiêu cụ thể sẽ là IE6, những người khác có thể sẽ ổn với nó.
AnthonyWJones

1

Một cách nhanh chóng mà tôi làm để tìm ra cảnh báo đến từ đâu, là vào bảng điều khiển và sau đó nhập vào đây

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

0

Khi nói đến các chức năng của trình duyệt js window.alertlà ưu việt và được biết đến nhiều nhất, những người không biết js biết alert()- hãy yên tâm rằng nó được hỗ trợ trong tất cả các trình duyệt đang sử dụng ngày nay và đoạn mã của bạn cũng vậy. Tuy nhiên, tôi sẽ không ghi đè (cũng giống như tái cấu trúc hơn là ghi đè theo nghĩa OOP) alert()cho trường hợp sử dụng cụ thể như của bạn bởi vì khi bạn thực sự cần sử dụng alert()mà không có mẫu, và có lẽ bạn sẽ cần một chức năng không cảnh báo khác để làm như vậy.


0

Tôi đã phải đối mặt với yêu cầu hiển thị một tin nhắn mặc định cùng với các tin nhắn cảnh báo thực tế. Đây là cách tôi quản lý để làm điều đó.


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

Tôi đã thử nó trên chrome. Tôi không chắc liệu nó là một thực hành tốt, nhưng nó phục vụ mục đích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.