a

Câu hỏi JavaScript: Cảnh báo ghi đè ()


Có ai có bất kỳ trải nghiệm nào với việc ghi đè alert() chức năng trong JavaScript?

  • 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ì?

192
2017-11-13 14:22


gốc


Nếu bạn bỏ phiếu, hãy giải thích lý do. Nó có thể chỉ là tôi có một lý do hoàn toàn hợp lệ để làm điều này. - roosteronacid
Tôi không hiểu cuộc bỏ phiếu ở đây. - Josh Stodola
Đó không phải là một vòng lặp vô hạn? - Pool
@ Không - không, không phải. Hàm window.alert 'bình thường' sẽ được gán cho window._alert. > Sau <hàm window.alert được định nghĩa lại. - Chris Shouts
@roosteronacid: Mã của bạn có ngữ nghĩa và tốt về mặt cú pháp, mặc dù có nhiều ý nghĩa, như @ paper1337 đã chỉ ra ... không có cơ hội đệ quy nào có lol ... về bản chất bạn chỉ đổi chỗ cơ quan chức năng với _alert như một loại expando tạm thời trong trường hợp đầu tiên. - non sequitor


Các câu trả lời:


Nó chắc chắn là "được hỗ trợ". Đó 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 (proxied)

Thông tin thêm tại đây: Các kiểu JQuery #Proxy Pattern


194
2017-11-13 14:50



Câu trả lời tuyệt vời! Tôi hoàn toàn quên rằng mô hình :) - roosteronacid
Không vấn đề gì! Tôi cũng chia sẻ quan điểm của Josh Stodola về điều này, bình luận tuyệt vời quá .. - Mike Gleason jr Couturier
Aye. Đã lên bình chọn câu trả lời của mình. Của bạn là rõ ràng hơn ngươi .. Và nó đi kèm với một ví dụ. Thats luôn luôn là một đám đông pleaser :) - roosteronacid
Ugh! apply() không có sẵn trên window.alert trong Internet Explorer 8. - roosteronacid
Họ phải ghi đè nó bằng cách sử dụng mẫu proxy: D - Josh Stodola


Mặc dù hầu hết các trình duyệt hỗ trợ ghi đè 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 hiện, một số thư viện dựa vào 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 thế, bạn có thể phá vỡ mọi thứ, khi sử dụng mã của 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ể kèm theo nó với một hàm ẩn danh, như sau:

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

22
2017-11-13 16:53





Không có mối nguy hiểm nào trong chức năng Overring alert. 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.');

14
2017-11-13 16:08



Ở đó có thể là một mối nguy hiểm nếu thay thế của bạn là không chặn. Ví dụ: mã có cuộc 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


Tôi nghĩ mọi triển khai Javascript sẽ hỗ trợ điều này và không có mối nguy hiểm nào liên quan đến nó. Nó thường được thực hiện để thay thế các hộp cảnh báo theo kiểu OS đơn giản sang một cái gì đó 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 tại! Thực tế là nó có thể làm cho Javascript tuyệt vời.


13
2017-11-13 14:34





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 phải ghi đè hàm trên nguyên mẫu của Window nhà thầu (lưu ý vốn W), do đó, hacker vẫn có thể nhập:

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

do đó, bạn cũng cần ghi đè hàm đó bằng:

Window.prototype.alert = null

hoặc là

Window.prototype.alert = function(){}

9
2018-02-23 02:44



Điều này không nhất thiết 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ó "cá thể" của 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


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 là

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

7
2018-02-22 13:58





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 được hiển thị "Vui lòng đăng ký!" nag màn hình thông qua thời gian cảnh báo đến thời gian.

Chúng ta vừa định nghĩa hàm alert () của chúng ta và thì đấy.

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


4
2017-11-13 14:53





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


2
2017-11-13 14:27



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


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

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

Vì vậy, trừ khi bạn đang 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 hàm mới.


2
2017-11-13 14:44