2013-02-25 24 views
6

Tôi có một số javascript dựa vào việc sử dụng window.open và liên lạc giữa các cửa sổ (nơi cửa sổ 'con' mới communicates success/failure to the 'parent' window).Phát hiện hỗ trợ trình duyệt để liên lạc giữa các cửa sổ

Điều này (giao tiếp giữa các cửa sổ) hoạt động tốt trong hầu hết các trường hợp, nhưng không hoạt động đối với một số trình duyệt không hỗ trợ liên lạc giữa các cửa sổ. Ví dụ: Windows PhoneiPhone's UIWebView.

Tôi hiện đang thực hiện phía máy khách (javascript) user-agent sniffing để phát hiện các tình huống này - và dự phòng cho một đường dẫn mã khác để khắc phục sự cố.

Có cách nào khác để đánh lừa tác nhân người dùng mà tôi có thể sử dụng không?

Để rõ ràng, window.open hoạt động (ở nơi hoạt động có nghĩa là 'nó mở url được yêu cầu'). Những gì không phải là đáng tin cậy là sử dụng window.opener và postMessage để thực hiện liên lạc giữa các cửa sổ từ 'con' thành 'cha mẹ'.

+0

Đứa trẻ cũng có thể truy cập thuộc tính window.opener - sẽ không có giá trị - nhưng tiếc là đây không phải là kỹ thuật phát hiện đáng tin cậy. Ví dụ, nếu bạn mở cửa sổ con trực tiếp (không sử dụng window.open từ cha mẹ) thì window.opener sẽ là null mặc dù đứa trẻ thực sự thực sự hỗ trợ giao tiếp giữa các cửa sổ. – mjwills

+0

tôi biết 'window.open' sẽ hoạt động, nhưng hàm sẽ trả về ID cửa sổ con không? – Raptor

+0

Tôi không chắc chắn về việc thông tin đó sẽ giúp ích như thế nào. Những gì tôi muốn là tính năng phát hiện bên trong cửa sổ con để cho dù nó có thể nói chuyện với cha mẹ của nó. Giá trị trả về của cuộc gọi hàm window.open rõ ràng chỉ có sẵn cho phụ huynh - vì vậy 'nó thay vì liên quan đến phía bên kia của đường hầm kín này'. Tất cả những gì đang được nói, kiểm tra giá trị trả về mang lại giá trị rỗng trong IE9 trên thiết bị di động và một đối tượng cửa sổ trong UIWebView. Và lưu ý rằng trong cả hai trường hợp, cửa sổ mới được tải chính xác (nhưng sẽ không thể kết nối với cha mẹ của nó). – mjwills

Trả lời

2

Trong mở cửa sổ tin nhắn gọi lại của bạn, bạn có thể gửi bài trả lời trở lại cửa sổ con như thế này:

function yourMessageCallback(event) { 
    // your other handler stuff here... 
    event.source.postMessage('Yeah I got it', event.origin); 
} 

Sau đó, bạn có thể làm một bộ đếm thời gian ở bên gửi mà bạn có thể xóa khi trả lời đến:

// do your postmessage here 

function notReceived() { 
    // do stuff if the message didn't go through 
} 

var messageTimer = setTimeout(notReceived, 500); // 500ms should be enough for everyone? 

window.addEventListener('message', function(event) { 
    // do necessary origin checks first etc... (not shown here) 

    if (event.data == 'Yeah I got it') { 
    clearTimeout(messageTimer); 
    // do stuff if the message went through 
    } 
}, false); 

Tôi biết điều này có thể là một giải pháp ít hack nhưng có thể ít hơn so với tác nhân người dùng đánh hơi?

+0

Tôi sợ rằng tôi có thể hiểu sai đề xuất của bạn @sactor. Khối mã đầu tiên có được đặt bên trong cửa sổ chính và khối thứ hai được đặt bên trong cửa sổ con không? Hãy nhớ rằng [postMessage cho phụ huynh sẽ không hoạt động] (http://stackoverflow.com/a/12265816/34092). – mjwills

+0

Hoặc bạn đang đề nghị 'chỉ cần thử postMessage, và nếu chúng ta không nhận được' ack 'thì chúng ta biết nó không hoạt động'.? Điều đó có thể hoạt động nhưng có thể có cùng một vấn đề với nhận xét thứ 2 về bài đăng gốc của tôi. Vì vậy, nếu cửa sổ con được mở trực tiếp bởi người dùng cuối trong trình duyệt - thay vì bằng cửa sổ của cha mẹ.open - thì kỹ thuật được đề xuất của bạn sẽ không thể phát hiện xem liệu liên lạc giữa các khung có được hỗ trợ hay không. – mjwills

+0

Có, tôi chỉ đề nghị kiểm tra xem chúng tôi có quay trở lại không. Tôi nghĩ rằng mục đích của bạn là để kiểm tra xem bạn có thể thực sự nhận được tin nhắn cho phụ huynh, không nếu nó về mặt lý thuyết có thể (nếu nó không được mở một cách sai lầm). Cho rằng tôi không may có một câu trả lời. – sactor

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