Nhiệm vụ rất phổ biến là mở cửa sổ bật lên trong trình duyệt để hiển thị một số thông tin bổ sung cho người dùng hoặc trong trường hợp của tôi là mở phiên bản thân thiện với bản in của trang. Tuy nhiên, bạn cần cẩn thận khi triển khai tính năng này vì nếu thực hiện không đúng cách, trình duyệt của bạn có thể chặn cửa sổ bật lên
Sử dụng cửa sổ. open[] để hiển thị cửa sổ bật lên trong trình duyệt
Tất cả các trình duyệt đều hỗ trợ window.open[]
để hiển thị cửa sổ bật lên, nhưng có một số quy tắc ở đó. Cửa sổ phải được mở do hành động của người dùng, chẳng hạn như nhấp vào nút. Tuy nhiên, nếu bạn thêm lệnh gọi ajax bên trong sự kiện nhấp vào nút và cố gắng mở cửa sổ bật lên bên trong lệnh gọi lại, thì hành động đó không còn được coi là hành động của người dùng nữa và cửa sổ bật lên đó sẽ bị chặn. Ví dụ: đoạn mã sau sẽ mở một cửa sổ mới do lệnh gọi ajax và người dùng sẽ thấy thông báo “Đã chặn cửa sổ bật lên”
printButtonClicked: function[]{
$.post["/ajax/friendlyPrintPage", postData].done[function [htmlContent] {
var id = [new Date[]].getTime[];
var myWindow = window.open[window.location.href + '?printerFriendly=true', id,
"toolbar=1,scrollbars=1,location=0,statusbar=0,menubar=1,resizable=1,width=800,
height=600,left = 240,top = 212"];
myWindow.document.write[htmlContent];
myWindow.focus[];
}]
}
Người dùng có thể bỏ chặn các cửa sổ bật lên như vậy, nhưng có một cách tốt hơn để giải quyết vấn đề này mà người dùng không cần thực hiện thêm thao tác nào
Cách chính xác để mở một cửa sổ bật lên mới trong JavaScript
Cách tốt hơn để tránh hoàn toàn việc chặn cửa sổ bật lên trong trình duyệt là mở một cửa sổ mới do hành động của người dùng, nhưng hãy điền nội dung vào cửa sổ đó sau khi yêu cầu ajax hoàn tất
Đoạn mã sau cho biết cách gọi chính xác window.open[]
để hiển thị cửa sổ bật lên, cửa sổ bật lên này sẽ không bị chặn bởi trình duyệt
// immediately open a new pop up window, but fill it with content later,
// when ajax request will be completed
printButtonClicked: function[]{
var id = [new Date[]].getTime[];
var myWindow = window.open[window.location.href + '?printerFriendly=true', id,
"toolbar=1,scrollbars=1,location=0,statusbar=0,menubar=1,resizable=1,width=800,
height=600,left = 240,top = 212"];
$.post["/ajax/friendlyPrintPage", postData].done[function[htmlContent] {
myWindow.document.write[htmlContent];
myWindow.focus[];
}];
}
Như bạn thấy, điều đầu tiên bạn phải làm là mở một cửa sổ mới và lưu ID của nó, để sau này sau khi thực hiện xong lệnh gọi ajax, bạn có thể cập nhật nội dung của cửa sổ bật lên thành bất kỳ nội dung nào được trả về cho bạn từ cửa sổ bật lên.
Alex Shapovalov
Alex Shapovalov là người sáng lập Yaplex – một công ty tư vấn CNTT và phát triển phần mềm, có trụ sở tại Ontario, Canada. Alex cung cấp dịch vụ tư vấn CNTT và. NET dịch vụ phát triển phần mềm ở Canada và Hoa Kỳ
User798903548 đã đăngCách duy nhất để vượt qua trình chặn cửa sổ bật lên là để hoạt động của người dùng trực tiếp mở cửa sổ.
Hoặc.
Điều này sẽ hoạt động hầu hết thời gian, trừ khi người dùng đã đặt trình chặn của mình để từ chối tất cả các cửa sổ bật lên
Cách khác là bảo anh ta tắt trình chặn
Ứng dụng này sử dụng JavaScript cho chức năng của nó. Vui lòng đóng trình duyệt của bạn, bật JavaScript và tải lại trang này để tiếp tục
NC
Đôi khi, khi chúng tôi cố gắng mở một cửa sổ bằng phương pháp window.open
, chúng tôi có thể thấy cửa sổ bật lên cấp quyền của trình duyệt yêu cầu quyền mở cửa sổ bật lên được tạo bởi window.open
Trong bài viết này, chúng ta sẽ xem xét cách tránh các trình chặn cửa sổ bật lên của trình duyệt trong mã JavaScript của chúng ta
Cửa sổ tránh cuộc gọi. mở trong Chức năng không đồng bộĐể tránh cửa sổ bật lên cho phép mở cửa sổ bật lên, chúng ta nên sử dụng tránh gọi window.open
trong hàm trả về lời hứa hoặc gọi lại cho các hàm như setTimeout
, setInterval
hoặc bất kỳ hàm không đồng bộ nào khác
Điều này là do, một cửa sổ bật lên chỉ có thể được mở từ một ứng dụng mà không được phép bằng hành động trực tiếp của người dùng
Độ sâu của chuỗi cuộc gọi cũng có thể quan trọng vì một số trình duyệt cũ hơn yêu cầu quyền là window.open
không được gọi bởi hàm chạy ngay sau khi người dùng thực hiện hành động
Do đó, chúng ta nên gọi window.open
trong các chức năng đồng bộ được chạy do hành động trực tiếp của người dùng để tránh cửa sổ bật lên cấp quyền bật lên hiển thị trong bất kỳ trình duyệt nào
Chúng tôi có thể kiểm tra xem cửa sổ bật lên có bị chặn hay không bằng cách kiểm tra xem window.open
có trả về
// immediately open a new pop up window, but fill it with content later,
// when ajax request will be completed
printButtonClicked: function[]{
var id = [new Date[]].getTime[];
var myWindow = window.open[window.location.href + '?printerFriendly=true', id,
"toolbar=1,scrollbars=1,location=0,statusbar=0,menubar=1,resizable=1,width=800,
height=600,left = 240,top = 212"];
$.post["/ajax/friendlyPrintPage", postData].done[function[htmlContent] {
myWindow.document.write[htmlContent];
myWindow.focus[];
}];
}
3 hoặc window.open
0 khôngChẳng hạn, chúng ta có thể kiểm tra xem cửa sổ bật lên có bị chặn hay không bằng cách viết
const pop = [url, w, h] => {
const popup = window.open[url, '_blank', 'toolbar=0,location=0,directories=0,status=1,menubar=0,titlebar=0,scrollbars=1,resizable=1,width=500,height=500'];
return popup !== null && typeof popup !== 'undefined'
}
console.log[pop['//example.com']]
Chúng tôi gọi window.open
với window.open
2 làm đối số đầu tiên và một chuỗi có một số cài đặt làm đối số thứ 3