Javascript thông thường không thể đóng cửa sổ willy-nilly. Đây là một tính năng bảo mật, được giới thiệu cách đây một thời gian, để ngăn chặn các khai thác độc hại và phiền toái khác nhau.
Từ thông số kỹ thuật mới nhất chowindow.close()
:
Các close()
phương pháp trên Window đối tượng nên, nếu tất cả các điều kiện sau đây được đáp ứng, gần bối cảnh duyệt Một :
- Bối cảnh duyệt tương ứng A có thể đóng tập lệnh .
- Bối cảnh duyệt của kịch bản đương nhiệm là quen thuộc với bối cảnh duyệt Một .
- Bối cảnh truy cập của kịch bản đương nhiệm được phép để điều hướng các bối cảnh duyệt Một .
Một bối cảnh duyệt có thể đóng được tập lệnh nếu đó là bối cảnh duyệt phụ được tạo bởi tập lệnh (trái ngược với hành động của người dùng) hoặc nếu đó là bối cảnh duyệt có lịch sử phiên chỉ chứa một Tài liệu.
Điều này có nghĩa, với một ngoại lệ nhỏ, javascript không được phép đóng một cửa sổ không được mở bởi cùng một javascript đó.
Chrome cho phép ngoại lệ đó - điều này không áp dụng cho mô tả người dùng - tuy nhiên Firefox thì không. Việc triển khai Firefox không thay đổi :
Phương thức này chỉ được phép gọi cho các cửa sổ đã được mở bởi một tập lệnh bằng window.open
phương thức này.
Nếu bạn cố gắng sử dụng window.close
từ Greasemonkey / Tampermonkey / userscript, bạn sẽ nhận được:
Firefox: Thông báo lỗi, " Scripts may not close windows that were not opened by script.
"
Chrome: chỉ âm thầm thất bại.
Giải pháp lâu dài:
Cách tốt nhất để giải quyết vấn đề này là tạo tiện ích mở rộng Chrome và / hoặc tiện ích bổ sung Firefox thay thế. Chúng có thể đóng cửa sổ hiện tại một cách đáng tin cậy.
Tuy nhiên, vì các rủi ro bảo mật, được đặt ra window.close
, ít hơn nhiều đối với tập lệnh Greasemonkey / Tampermonkey; Greasemonkey và Tampermonkey có thể cung cấp hợp lý chức năng này trong API của họ (về cơ bản là đóng gói công cụ mở rộng cho bạn).
Xem xét thực hiện một yêu cầu tính năng.
Cách giải quyết khó khăn:
Chrome hiện dễ bị khai thác "tự chuyển hướng". Vì vậy, mã như thế này được sử dụng để làm việc nói chung:
open(location, '_self').close();
Đây là hành vi lỗi, IMO và hiện tại (tính đến khoảng tháng 4 năm 2015) hầu hết bị chặn. Nó vẫn sẽ hoạt động từ mã được tiêm chỉ khi tab được mở mới và không có trang nào trong lịch sử duyệt web. Vì vậy, nó chỉ hữu ích trong một tình huống rất nhỏ.
Tuy nhiên, một biến thể vẫn hoạt động trên Chrome (v43 & v44) cộng với Tampermonkey (v3.11 trở lên) . Sử dụng một cách rõ ràng @grant
và đơn giản window.close()
. VÍ DỤ:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Cảm ơn zanetu đã cập nhật. Lưu ý rằng điều này sẽ không hoạt động nếu chỉ có một tab mở. Nó chỉ đóng các tab bổ sung.
Firefox an toàn trước sự khai thác đó. Vì vậy, cách javascript duy nhất là làm tê liệt các cài đặt bảo mật, mỗi lần một trình duyệt.
Bạn có thể mở lên about:config
và thiết lập
allow_scripts_to_close_windows
để true
.
Nếu kịch bản của bạn là dành cho sử dụng cá nhân, hãy tiếp tục và làm điều đó. Nếu bạn yêu cầu bất kỳ ai khác bật cài đặt đó, họ sẽ thông minh và chính đáng, từ chối với định kiến.
Hiện tại không có cài đặt tương đương cho Chrome.
window.close()
làm việc cho tôi trong chrome.