'console' là lỗi không xác định cho Internet Explorer


375

Tôi đang sử dụng Fireorms và có một số tuyên bố như:

console.log("...");

trong trang của tôi Trong IE8 (có thể là các phiên bản trước đó), tôi gặp lỗi tập lệnh nói rằng 'console' không được xác định. Tôi đã thử đặt cái này ở đầu trang của tôi:

<script type="text/javascript">
    if (!console) console = {log: function() {}};
</script>

tôi vẫn nhận được lỗi Bất kỳ cách nào để thoát khỏi các lỗi?


4
Sử dụng typeoftrong if của bạn, nó sẽ tránh các lỗi không xác định: if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Flak DiNenno

21
console.log () chỉ hoạt động khi công cụ dev của IE mở (vâng IE là crappy). xem stackoverflow.com/questions/7742781/ từ
Adrien Be

1
Câu trả lời hay nhất cho câu hỏi đó là stackoverflow.com/a/16916941/2274855
Vinícius Moraes


1
Liên kết @Aprillion bị hỏng, thay vào đó hãy sử dụng liên kết này: github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.js
Alfred Bez

Câu trả lời:


378

Thử

if (!window.console) console = ...

Một biến không xác định không thể được gọi trực tiếp. Tuy nhiên, tất cả các biến toàn cục là các thuộc tính có cùng tên của bối cảnh toàn cầu ( windowtrong trường hợp trình duyệt) và truy cập vào một thuộc tính không xác định là tốt.

Hoặc sử dụng if (typeof console === 'undefined') console = ...nếu bạn muốn tránh biến ma thuật window, xem câu trả lời của @Tim Down .


160
Chỉ cần rõ ràng cho bất cứ ai khác sử dụng này, đặt <script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>ở đầu trang của bạn! Cảm ơn Kenny.
windowsgm

11
Thế cònvar console = console || { log: function() {} };
devlord

9
@lorddev Để sử dụng tốc ký đó, bạn cần bao gồm window:var console = window.console || { log: function() {} };
jlengstorf

64
Chết tiệt ... bạn xây dựng một trang web đẹp, phát triển nó cho trình duyệt yêu thích của bạn. Cuối cùng, bạn dành 4-5 GIỜ để làm cho nó tương thích với tất cả các trình duyệt HIỆN ĐẠI khác, và sau đó bạn dành 4-5 NGÀY để nó tương thích với IE.
Israel

6
Vấn đề với câu trả lời đó là nếu bạn đang sử dụng một tên khác như gỡ lỗi, cảnh báo, đếm với trình duyệt thiếu bảng điều khiển sẽ đưa ra một ngoại lệ, hãy xem cách tốt hơn để thực hiện stackoverflow.com/a/16916941/2274855
Vinícius Moraes

319

Dán phần sau vào đầu JavaScript của bạn (trước khi sử dụng bảng điều khiển):

/**
 * Protect window.console method calls, e.g. console is not defined on IE
 * unless dev tools are open, and IE doesn't define console.debug
 * 
 * Chrome 41.0.2272.118: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
 * Firefox 37.0.1: log,info,warn,error,exception,debug,table,trace,dir,group,groupCollapsed,groupEnd,time,timeEnd,profile,profileEnd,assert,count
 * Internet Explorer 11: select,log,info,warn,error,debug,assert,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd,trace,clear,dir,dirxml,count,countReset,cd
 * Safari 6.2.4: debug,error,log,info,warn,clear,dir,dirxml,table,trace,assert,count,profile,profileEnd,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd
 * Opera 28.0.1750.48: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
 */
(function() {
  // Union of Chrome, Firefox, IE, Opera, and Safari console methods
  var methods = ["assert", "cd", "clear", "count", "countReset",
    "debug", "dir", "dirxml", "error", "exception", "group", "groupCollapsed",
    "groupEnd", "info", "log", "markTimeline", "profile", "profileEnd",
    "select", "table", "time", "timeEnd", "timeStamp", "timeline",
    "timelineEnd", "trace", "warn"];
  var length = methods.length;
  var console = (window.console = window.console || {});
  var method;
  var noop = function() {};
  while (length--) {
    method = methods[length];
    // define undefined methods as noops to prevent errors
    if (!console[method])
      console[method] = noop;
  }
})();

Trình bao bọc đóng hàm là để phạm vi các biến như không xác định bất kỳ biến nào. Điều này bảo vệ chống lại cả không xác định consolevà không xác định console.debug(và các phương pháp còn thiếu khác).

EDIT: Tôi nhận thấy rằng HTML5 Boilerplate sử dụng mã tương tự trong tệp js / plugins.js của nó, nếu bạn đang tìm kiếm một giải pháp (có thể) sẽ được cập nhật.


14
Tại sao có câu trả lời này rất ít upvote? Đây là một trong những đầy đủ nhất được đăng ở đây.
mavilein

Vì ngày tháng. Hoàn toàn đồng ý với các giải pháp làm việc chính xác. Tôi nghĩ chủ đề này cần được kiểm duyệt. Xin lỗi về tiếng Anh kém.
woto

Hoàn thành khá ngoại trừ việc nó sẽ không cố chuyển hướng đăng nhập vào chức năng ghi nhật ký (nếu có) để tất cả các bản ghi bị mất
Barshe Roussy

5
Khi nào điều này xảy ra chính xác? Mã này chỉ nên xác định các yếu tố chưa được xác định.
Peter Tseng

4
Tôi nghĩ một trong hai cách - (function () {...} ()) hoặc (function () {...}) () - hoạt động thực sự
Peter Tseng

73

Một cách khác là typeoftoán tử:

if (typeof console == "undefined") {
    this.console = {log: function() {}};
}

Tuy nhiên, một cách khác là sử dụng thư viện ghi nhật ký, chẳng hạn như log4javascript của riêng tôi .


Tuy nhiên, sẽ là một ý tưởng tốt để thay đổi bài tập chưa được khai báo thành một tuyên bố thích hợp.
kangax

1
Bạn có nghĩa là sử dụng var? Điều đó sẽ chỉ gây nhầm lẫn những điều ở đây. Hay bạn có nghĩa là giao cho window.consolehơn là console?
Tim Down

Sử dụng var. Tại sao nó lại nhầm lẫn mọi thứ ở đây?
kangax

2
Thật là một cuộc thảo luận khó hiểu. +1 để trả lời ban đầu. Nếu tôi có thể cung cấp +2 tôi sẽ cung cấp một liên kết đến log4javascript của riêng bạn. Cảm ơn OP!
Jay Taylor

8
@yckart: Số typeofđược đảm bảo trả về một chuỗi và "undefined"là một chuỗi. Khi hai toán hạng cùng loại =====được chỉ định để thực hiện chính xác các bước giống nhau. Sử dụng typeof x == "undefined"là một cách vững chắc để kiểm tra xem xkhông xác định trong bất kỳ phạm vi và bất kỳ môi trường tuân thủ ECMAScript 3 nào.
Tim Down

47

Để có giải pháp mạnh mẽ hơn, hãy sử dụng đoạn mã này (lấy từ mã nguồn của twitter):

// Avoid `console` errors in browsers that lack a console.
(function() {
    var method;
    var noop = function () {};
    var methods = [
        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
        'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || {});

    while (length--) {
        method = methods[length];

        // Only stub undefined methods.
        if (!console[method]) {
            console[method] = noop;
        }
    }
}());

13

Trong các kịch bản của tôi, tôi hoặc sử dụng tốc ký:

window.console && console.log(...) // only log if the function exists

hoặc, nếu không thể hoặc không khả thi để chỉnh sửa mọi dòng console.log, tôi tạo một bảng điều khiển giả:

// check to see if console exists. If not, create an empty object for it,
// then create and empty logging function which does nothing. 
//
// REMEMBER: put this before any other console.log calls
!window.console && (window.console = {} && window.console.log = function () {});

2
Lỗi cú pháp. Tại sao không chỉif(!console) {console = {} ; console.log = function(){};}
Meekohi

1
Hoặc không chỉ!window.console && (window.console = { log: function () { } });
Maksim Vi.

10

Bạn có thể sử dụng console.log()nếu bạn đã Developer Toolsmở trong IE8 và bạn cũng có thể sử dụng Consolehộp văn bản trên tab tập lệnh.


7
Điều này là không tốt nếu bạn quên lấy mã của giao diện điều khiển. Lỗi trong IE8 sẽ khiến mã JS của bạn không hoạt động
yunzen

7
if (typeof console == "undefined") {
  this.console = {
    log: function() {},
    info: function() {},
    error: function() {},
    warn: function() {}
  };
}

1
emptor caveat: điều này nên được xác định ở cấp độ toàn cầu trong đó thisđề cập đến window.
Sgnl

7

Dựa trên hai câu trả lời trước của

và các tài liệu cho

Đây là một triển khai nỗ lực tốt nhất cho vấn đề, nghĩa là nếu có console.log thực sự tồn tại, nó sẽ lấp đầy các khoảng trống cho các phương thức không tồn tại thông qua console.log.

Ví dụ: đối với IE6 / 7, bạn có thể thay thế ghi nhật ký bằng cảnh báo (ngu ngốc nhưng hoạt động) và sau đó bao gồm quái vật bên dưới (tôi gọi nó là console.js): [Hãy thoải mái xóa nhận xét khi bạn thấy phù hợp, tôi để chúng tham khảo, một bộ giảm thiểu có thể giải quyết chúng]:

<!--[if lte IE 7]>
<SCRIPT LANGUAGE="javascript">
    (window.console = window.console || {}).log = function() { return window.alert.apply(window, arguments); };
</SCRIPT>
<![endif]-->
<script type="text/javascript" src="console.js"></script>

và console.js:

    /**
     * Protect window.console method calls, e.g. console is not defined on IE
     * unless dev tools are open, and IE doesn't define console.debug
     */
    (function() {
        var console = (window.console = window.console || {});
        var noop = function () {};
        var log = console.log || noop;
        var start = function(name) { return function(param) { log("Start " + name + ": " + param); } };
        var end = function(name) { return function(param) { log("End " + name + ": " + param); } };

        var methods = {
            // Internet Explorer (IE 10): http://msdn.microsoft.com/en-us/library/ie/hh772169(v=vs.85).aspx#methods
            // assert(test, message, optionalParams), clear(), count(countTitle), debug(message, optionalParams), dir(value, optionalParams), dirxml(value), error(message, optionalParams), group(groupTitle), groupCollapsed(groupTitle), groupEnd([groupTitle]), info(message, optionalParams), log(message, optionalParams), msIsIndependentlyComposed(oElementNode), profile(reportName), profileEnd(), time(timerName), timeEnd(timerName), trace(), warn(message, optionalParams)
            // "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "msIsIndependentlyComposed", "profile", "profileEnd", "time", "timeEnd", "trace", "warn"

            // Safari (2012. 07. 23.): https://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/Safari_Developer_Guide/DebuggingYourWebsite/DebuggingYourWebsite.html#//apple_ref/doc/uid/TP40007874-CH8-SW20
            // assert(expression, message-object), count([title]), debug([message-object]), dir(object), dirxml(node), error(message-object), group(message-object), groupEnd(), info(message-object), log(message-object), profile([title]), profileEnd([title]), time(name), markTimeline("string"), trace(), warn(message-object)
            // "assert", "count", "debug", "dir", "dirxml", "error", "group", "groupEnd", "info", "log", "profile", "profileEnd", "time", "markTimeline", "trace", "warn"

            // Firefox (2013. 05. 20.): https://developer.mozilla.org/en-US/docs/Web/API/console
            // debug(obj1 [, obj2, ..., objN]), debug(msg [, subst1, ..., substN]), dir(object), error(obj1 [, obj2, ..., objN]), error(msg [, subst1, ..., substN]), group(), groupCollapsed(), groupEnd(), info(obj1 [, obj2, ..., objN]), info(msg [, subst1, ..., substN]), log(obj1 [, obj2, ..., objN]), log(msg [, subst1, ..., substN]), time(timerName), timeEnd(timerName), trace(), warn(obj1 [, obj2, ..., objN]), warn(msg [, subst1, ..., substN])
            // "debug", "dir", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "time", "timeEnd", "trace", "warn"

            // Chrome (2013. 01. 25.): https://developers.google.com/chrome-developer-tools/docs/console-api
            // assert(expression, object), clear(), count(label), debug(object [, object, ...]), dir(object), dirxml(object), error(object [, object, ...]), group(object[, object, ...]), groupCollapsed(object[, object, ...]), groupEnd(), info(object [, object, ...]), log(object [, object, ...]), profile([label]), profileEnd(), time(label), timeEnd(label), timeStamp([label]), trace(), warn(object [, object, ...])
            // "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "profile", "profileEnd", "time", "timeEnd", "timeStamp", "trace", "warn"
            // Chrome (2012. 10. 04.): https://developers.google.com/web-toolkit/speedtracer/logging-api
            // markTimeline(String)
            // "markTimeline"

            assert: noop, clear: noop, trace: noop, count: noop, timeStamp: noop, msIsIndependentlyComposed: noop,
            debug: log, info: log, log: log, warn: log, error: log,
            dir: log, dirxml: log, markTimeline: log,
            group: start('group'), groupCollapsed: start('groupCollapsed'), groupEnd: end('group'),
            profile: start('profile'), profileEnd: end('profile'),
            time: start('time'), timeEnd: end('time')
        };

        for (var method in methods) {
            if ( methods.hasOwnProperty(method) && !(method in console) ) { // define undefined methods as best-effort methods
                console[method] = methods[method];
            }
        }
    })();

Tôi không chắc chắn nếu chúng ta cần methods.hasOwnProperty(method) && trong vòng lặp for.
TWiStErRob

Tôi chắc chắn rằng bạn cần nó.
ErikE

Đã kiểm tra nhanh trong bảng điều khiển của Chrome: > x = { a: 1, b: 2}-> Object {a: 1, b: 2}for(var f in x) {console.log(f + " " + x[f]);} 'end'-> a 1 b 2 "end". Vì vậy, một đối tượng ẩn danh được tạo không có bất kỳ thuộc tính bổ sung nào và methodschỉ được tạo trước forvòng lặp. Có thể hack ở trên?
TWiStErRob

3
Đúng. var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}Bạn không bao giờ biết thư viện đã làm gì với các đối tượng trong chuỗi kế thừa của đối tượng bạn đang làm việc. Do đó, khuyến nghị của các công cụ chất lượng mã javascript như jshint và jslint sẽ sử dụng hasOwnProperty.
ErikE

6

Trong IE9, nếu bàn điều khiển không được mở, mã này:

alert(typeof console);

sẽ hiển thị "đối tượng", nhưng mã này

alert(typeof console.log);

sẽ ném ngoại lệ TypeError, nhưng không trả về giá trị không xác định;

Vì vậy, phiên bản mã được bảo đảm sẽ trông giống như thế này:

try {
    if (window.console && window.console.log) {
        my_console_log = window.console.log;
    }
} catch (e) {
    my_console_log = function() {};
}

6

Tôi chỉ sử dụng console.log trong mã của tôi. Vì vậy, tôi bao gồm một lớp lót 2 rất ngắn

var console = console || {};
console.log = console.log || function(){};

1
Cách thức hoạt động của nó .. Tôi không thấy bất kỳ dòng console.log nào được in trên trình duyệt IE, tôi đã thử nghiệm với 2 hệ thống khác nhau trong đó 1 - console.log đang hoạt động và 2 hệ thống thì không. tôi đã thử trong cả hai nhưng không thể thấy bất kỳ nhật ký nào trong cả hai hệ thống.
kiran

2

Nhận thấy rằng OP đang sử dụng Fireorms với IE, vì vậy, giả sử đó là Fireorms Lite . Đây là một tình huống thú vị khi bảng điều khiển được xác định trong IE khi cửa sổ trình gỡ lỗi được mở, nhưng điều gì xảy ra khi Fireorms đang chạy? Không chắc chắn, nhưng có lẽ phương thức "fireormsx.js" có thể là một cách tốt để kiểm tra trong tình huống này:

nguồn:

https://code.google.com.vn/p/forms/source/browse/branches/fireorms1.2/lite/fireormsx.js?r=187

    if (!window.console || !console.firebug) {
        var names = [
            "log", "debug", "info", "warn", "error", "assert",
            "dir","dirxml","group","groupEnd","time","timeEnd",
            "count","trace","profile","profileEnd"
        ];
        window.console = {};
        for (var i = 0; i < names.length; ++i)
            window.console[names[i]] = function() {}
    }

(cập nhật liên kết 12/2014)


1

Tôi đang sử dụng Fauxconsole ; Tôi đã sửa đổi css một chút để nó trông đẹp hơn nhưng hoạt động rất tốt.


1

Để gỡ lỗi trong IE, hãy xem log4javascript này


Điều này thật tuyệt, đặc biệt là khi bảng điều khiển IE8 của tôi không xuất ra bất cứ thứ gì.
Firsh - LetsWP.io

1
@Firsh Cảm ơn ý kiến ​​của bạn.
Praveen

1
Tôi đang tìm kiếm bình luận cho một câu hỏi khác ở đây có nội dung 'tự quảng cáo không biết xấu hổ' hoặc tôi không biết - tương tự - một người nói rằng anh ta đã tạo ra scipt này, phải không? Tôi đã đóng tab đó. Dù sao nó là một công cụ thực sự tuyệt vời và rất hữu ích cho dự án của tôi.
Firsh - LetsWP.io

1
@Firsh Tôi không tạo tập lệnh này, tôi là người như bạn được hưởng lợi khi sử dụng công cụ.
Praveen

1

Đối với IE8 hoặc hỗ trợ bảng điều khiển giới hạn ở console.log (không gỡ lỗi, theo dõi, ...), bạn có thể thực hiện các thao tác sau:

  • Nếu bàn điều khiển HOẶC console.log không xác định: Tạo các hàm giả cho các chức năng của bàn điều khiển (theo dõi, gỡ lỗi, đăng nhập, ...)

    window.console = { debug : function() {}, ...};

  • Khác nếu console.log được xác định (IE8) AND console.debug (bất kỳ loại nào khác) không được xác định: chuyển hướng tất cả các chức năng ghi nhật ký đến console.log, điều này cho phép giữ các nhật ký đó!

    window.console = { debug : window.console.log, ...};

Không chắc chắn về hỗ trợ khẳng định trong các phiên bản IE khác nhau, nhưng mọi đề xuất đều được chào đón. Cũng đăng câu trả lời này tại đây: Làm cách nào tôi có thể sử dụng bảng điều khiển đăng nhập trong Internet Explorer?



1

Sơ khai của bảng điều khiển trong TypeScript:

if (!window.console) {
console = {
    assert: () => { },
    clear: () => { },
    count: () => { },
    debug: () => { },
    dir: () => { },
    dirxml: () => { },
    error: () => { },
    group: () => { },
    groupCollapsed: () => { },
    groupEnd: () => { },
    info: () => { },
    log: () => { },
    msIsIndependentlyComposed: (e: Element) => false,
    profile: () => { },
    profileEnd: () => { },
    select: () => { },
    time: () => { },
    timeEnd: () => { },
    trace: () => { },
    warn: () => { },
    }
};

0

Bạn có thể sử dụng những điều dưới đây để cung cấp thêm một mức bảo hiểm mà bạn đã có tất cả các cơ sở được bảo hiểm. Sử dụng typeofđầu tiên sẽ tránh bất kỳ undefinedlỗi nào . Việc sử dụng ===cũng sẽ đảm bảo rằng tên của loại thực sự là chuỗi "không xác định". Cuối cùng, bạn sẽ muốn thêm một tham số vào chữ ký hàm (tôi đã chọn logMsgtùy ý) để đảm bảo tính nhất quán, vì bạn chuyển bất cứ thứ gì bạn muốn in ra bàn điều khiển cho chức năng nhật ký. Điều này cũng giữ cho bạn chính xác và tránh mọi cảnh báo / lỗi trong IDE nhận biết về JS của bạn.

if(!window.console || typeof console === "undefined") {
  var console = { log: function (logMsg) { } };
}


0

Gặp phải vấn đề tương tự khi chạy console.log trong các cửa sổ con trong IE9, được tạo bởi hàm window.open.

Có vẻ như trong trường hợp này, bàn điều khiển chỉ được xác định trong cửa sổ cha và không được xác định trong các cửa sổ con cho đến khi bạn làm mới chúng. Áp dụng tương tự cho trẻ em của cửa sổ trẻ em.

Tôi giải quyết vấn đề này bằng cách gói nhật ký trong chức năng tiếp theo (bên dưới là đoạn mô-đun)

getConsole: function()
    {
        if (typeof console !== 'undefined') return console;

        var searchDepthMax = 5,
            searchDepth = 0,
            context = window.opener;

        while (!!context && searchDepth < searchDepthMax)
        {
            if (typeof context.console !== 'undefined') return context.console;

            context = context.opener;
            searchDepth++;
        }

        return null;
    },
    log: function(message){
        var _console = this.getConsole();
        if (!!_console) _console.log(message);
    }

-2

Sau khi gặp quá nhiều vấn đề với điều này (thật khó để sửa lỗi vì nếu bạn mở bảng điều khiển dành cho nhà phát triển thì lỗi không còn xảy ra nữa!) Tôi quyết định tạo một mã quá mức để không bao giờ phải bận tâm về điều này nữa:

if (typeof window.console === "undefined")
    window.console = {};

if (typeof window.console.debug === "undefined")
    window.console.debug= function() {};

if (typeof window.console.log === "undefined")
    window.console.log= function() {};

if (typeof window.console.error === "undefined")
    window.console.error= function() {alert("error");};

if (typeof window.console.time === "undefined")
    window.console.time= function() {};

if (typeof window.console.trace === "undefined")
    window.console.trace= function() {};

if (typeof window.console.info === "undefined")
    window.console.info= function() {};

if (typeof window.console.timeEnd === "undefined")
    window.console.timeEnd= function() {};

if (typeof window.console.group === "undefined")
    window.console.group= function() {};

if (typeof window.console.groupEnd === "undefined")
    window.console.groupEnd= function() {};

if (typeof window.console.groupCollapsed === "undefined")
    window.console.groupCollapsed= function() {};

if (typeof window.console.dir === "undefined")
    window.console.dir= function() {};

if (typeof window.console.warn === "undefined")
    window.console.warn= function() {};

Cá nhân tôi chỉ sử dụng console.log và console.error, nhưng mã này xử lý tất cả các chức năng khác như được hiển thị trong Mạng lưới nhà phát triển Mozzila: https://developer.mozilla.org/en-US/docs/Web/API/console . Chỉ cần đặt mã đó lên đầu trang của bạn và bạn sẽ hoàn thành công việc này mãi mãi.


-11

Bạn có thể sử dụng console.log (...) trực tiếp trong Firefox nhưng không phải trong IE. Trong IE bạn phải sử dụng window.console.


11
console.log và window.console.log đề cập đến cùng một chức năng trong bất kỳ trình duyệt nào thậm chí phù hợp từ xa với ECMAscript. Đó là một thực tế tốt để sử dụng cái sau để tránh một biến cục bộ vô tình che khuất đối tượng bảng điều khiển toàn cầu, nhưng điều đó hoàn toàn không liên quan gì đến sự lựa chọn của trình duyệt. console.log hoạt động tốt trong IE8 và AFAIK hoàn toàn không có khả năng ghi nhật ký trong IE6 / 7.
Tgr
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.