2010-04-24 36 views
12

Tôi muốn có một nút trên một trang web với các hành vi sau đây:Trong Google Chrome, làm cách nào để đưa cửa sổ bật lên hiện có lên phía trước bằng javascript từ cửa sổ chính?

  • Trên nhấp chuột đầu tiên, mở một cửa sổ pop-up.
  • Khi nhấp chuột sau, nếu cửa sổ bật lên vẫn mở, chỉ cần đưa nó lên phía trước. Nếu không, hãy mở lại.

Mã bên dưới hoạt động trong Firefox (Mac & Windows), Safari (Mac & Windows) và IE8. (Tôi chưa thử nghiệm IE6 hoặc IE7.) Tuy nhiên, trong Google Chrome (cả Mac & Windows), các lần nhấp chuột sau đó không thể đưa cửa sổ bật lên hiện có lên phía trước như mong muốn.

Tôi làm cách nào để làm việc này trong Chrome?

<head> 
    <script type="text/javascript"> 
    var popupWindow = null; 
    var doPopup = function() { 
     if (popupWindow && !popupWindow.closed) { 
     popupWindow.focus(); 
     } else { 
     popupWindow = window.open("http://google.com", "_blank", 
      "width=200,height=200"); 
     } 
    }; 
    </script> 
</head> 

<body> 
    <button onclick="doPopup(); return false"> 
    create a pop-up 
    </button> 
</body> 

Bối cảnh: Tôi lại hỏi this question đặc biệt dành cho Google Chrome, như tôi nghĩ tôi mã của tôi giải quyết vấn đề ít nhất là cho các trình duyệt hiện đại khác và IE8. Nếu có một nghi thức ưa thích để làm như vậy, xin vui lòng cho tôi biết.

+1

Có vẻ như vấn đề này đã được báo cáo ~ 1.5 năm trước: http://code.google.com/p/chromium/issues/detail?id=1674 – brahn

Trả lời

8

Bạn không thể. Window.focus bị tắt trong Chrome vì lý do bảo mật và điều đó có thể không thay đổi.

Bạn phải đóng và mở lại cửa sổ tương ứng.

+3

Oof, thật là bực mình. Trong sự tò mò, mối quan tâm an ninh là gì? Tôi thấy một số cuộc thảo luận về những gì có thể là lý do liên quan [ở đây] (http://code.google.com/p/chromium/issues/detail?id=1383#c8), mặc dù điều đó có vẻ nhiều hơn về tiêu điểm đánh cắp cửa sổ bật lên từ cửa sổ cha mẹ chứ không phải cửa sổ chính để đưa tiêu điểm vào cửa sổ bật lên (đó là những gì tôi đang tìm kiếm). Cảm ơn! – brahn

+1

Tôi cũng muốn biết về những lo ngại liên quan. – marquito

+0

Sau tất cả những năm này, đây vẫn là một sự thất vọng lớn với tư cách là người dùng, hãy để một mình một nhà phát triển. Sẽ rất tốt nếu ai đó cung cấp liên kết đến nội dung nào đó giải thích lý do vì lý do bảo mật có vẻ giống như các công ty đào tạo nói "vì lợi ích của hành khách" khi họ áp đặt một số quy định khẩn cấp mà không cần thiết. –

0

Tại sao không chỉ làm popopWindow.focus() sau khi gọi window.open? Nó sẽ không làm tổn thương để làm điều đó ở đó, và nó phải đảm bảo rằng cửa sổ mới của bạn được hiển thị trên đầu trang của hiện tại.

+0

Mã hiện tại dẫn đến hành vi mong muốn (ví dụ: bật lên trên cùng) với cửa sổ mới - vấn đề là với một cửa sổ hiện có. – brahn

0

Bạn cần đặt cửa sổ gốc để làm mờ và cửa sổ mới cần lấy nét.

var popup = { //popup = object literal representing your popup 
    execute = (function() { 
     popup.win = window.open(); 
     popup.win.focus(); 
    }()); 
}; 
window.blur(); 
+0

Tôi không chắc mình hiểu mã này, nhưng giống như lời bình luận của Chris ở trên, dường như đảm bảo rằng cửa sổ bật lên được tập trung khi mở lần đầu tiên, nhưng không làm gì để tập trung vào một nút bấm sau. – brahn

+0

Đó là chính xác. Không có phương thức "luôn luôn ở trên" có sẵn cho JavaScript và sẽ không bao giờ có một thứ như vậy. Khi bạn nhấp vào bên ngoài cửa sổ của cửa sổ bật lên, nó sẽ mất tập trung và nằm sau cửa sổ nhận lấy nét. Cách duy nhất để thay đổi điều này là nhấp lại vào cửa sổ bật lên. –

+0

OK, cảm ơn bạn đã làm rõ! – brahn

0

Các mã sau làm việc cho tôi khi gọi một handler onclick:

var popup = window.open('', 'popup-name', 'resizable,width=480=height=575'); 

if(popup.location == 'about:blank') { 
    popup.location = 'http://google.com'; 
    return; 
} 

Mã này hoạt động bằng cách cố gắng để truy cập vào vị trí của người popup, nếu về nó: blank một popup mới và url được đặt. Nếu không, nếu cửa sổ có cùng tên 'popup-name' đã được mở thì popup sẽ xuất hiện. Mã này không cần phải được gọi từ một trình xử lý onclick nếu không nó sẽ không hoạt động.

Các vấn đề liên quan