2012-02-09 34 views
23

Tôi có một tập lệnh mà tôi không thể thay đổi mà thực hiện nhiều cuộc gọi console.log. Tôi muốn thêm một lớp khác và trả lời nếu các cuộc gọi có chứa các chuỗi nhất định. Này hoạt động trong FF, nhưng ném một lỗi "bất hợp pháp gọi" trong Chrome trên dòng thứ 4:Chặn cuộc gọi đến console.log trong Chrome

var oldConsole = {}; 
oldConsole.log = console.log; 
console.log = function (arg) { 
    oldConsole.log('MY CONSOLE!!'); 
    oldConsole.log(arg); 
} 

Bất kỳ ý tưởng làm thế nào để có được xung quanh đó? Tôi cũng đã cố gắng nhân bản giao diện điều khiển ...

Trả lời

29

Bạn cần phải gọi console.log trong bối cảnh console cho chrome:

(function() { 
    var log = console.log; 
    console.log = function() { 
    log.call(this, 'My Console!!!'); 
    log.apply(this, Array.prototype.slice.call(arguments)); 
    }; 
}()); 
+0

đẹp ... được tìm kiếm một cái gì đó như thế này. Điều này có thể được sử dụng để trang trí bất kỳ chức năng trong javascript? – Shane

+2

@Shane, đây là mẫu cơ bản để chặn cuộc gọi hàm, tuy nhiên tôi khuyên bạn không nên sử dụng nó trừ khi thật cần thiết. Tốt hơn hết là chỉ cần sửa đổi trực tiếp chức năng, hoặc sử dụng các khái niệm OOP. – zzzzBov

+0

xây dựng một khuôn khổ nơi có rất nhiều thời gian chạy lắp ráp các thành phần, đây sẽ là một công cụ tiện dụng cho một cách tiếp cận hướng bên ngoài để gỡ lỗi các thành phần hoặc sửa đổi các thành phần hiện có với plugins, vv. Chỉ cần tò mò những hạn chế sẽ được. Tôi sẽ không sửa đổi các chức năng nội tại, chỉ có các phương thức thành phần khung công tác. – Shane

4

Bạn cũng có thể sử dụng cùng một logic, nhưng gọi nó ra khỏi giao diện điều khiển đối tượng như vậy bối cảnh là như nhau.

if(window.console){ 
    console.yo = console.log; 
    console.log = function(str){ 
    console.yo('MY CONSOLE!!'); 
    console.yo(str); 
    } 
} 
0

Với ES6 hành lây lan mới, bạn có thể viết nó như thế này

(function() { 
    var log = console.log; 
    console.log = function() { 
    log.call(this, 'My Console!!!', ...arguments); 
    }; 
}()); 
0

Tôi biết đó là một bài cũ nhưng nó có thể hữu ích nào như những người khác giải pháp không tương thích với các trình duyệt cũ.

Bạn có thể xác định lại hành vi của mỗi chức năng của giao diện điều khiển (và cho tất cả các trình duyệt) như thế này:

// define a new console 
var console = (function(oldCons){ 
    return { 
     log: function(text){ 
      oldCons.log(text); 
      // Your code 
     }, 
     info: function (text) { 
      oldCons.info(text); 
      // Your code 
     }, 
     warn: function (text) { 
      oldCons.warn(text); 
      // Your code 
     }, 
     error: function (text) { 
      oldCons.error(text); 
      // Your code 
     } 
    }; 
}(window.console)); 

//Then redefine the old console 
window.console = console; 
Các vấn đề liên quan