Có một số cách để truyền thông điệp nhiều phần tới trình xử lý postMessage
. Cách đầu tiên (và ít hơn "sạch") là sử dụng ký tự phân cách, sau đó chuyển dữ liệu của bạn qua một chuỗi.
Giả sử chúng tôi muốn chuyển ID người dùng, hành động và tên người dùng. Chuỗi sẽ trông như thế này:
54|do_logout|chris
Trong handler postMessage
, dữ liệu thông qua có thể split
(docs) trên nhân vật |
, sau đó mỗi phân khúc của thông điệp có thể được sử dụng khi cần thiết.
Một tuyến đường khác, thay vì tạo/tách chuỗi thủ công, là sử dụng JSON (docs) để chuyển đổi đối tượng thành chuỗi ở một bên và sử dụng JSON để chuyển đổi lại đối tượng trong trình xử lý.
var pass_data = {
'name':'Chris',
'id':54,
'action':'do_logout'
};
target_window.postMessage(JSON.stringify(pass_data), "http://www.example.net");
... sau đó trong xử lý:
function (event) {
var pass_data = JSON.parse(event.data);
}
Hãy chắc chắn để kiểm tra, tuy nhiên, như đối tượng JSON
không được cung cấp trên tất cả các đại lý người dùng, đặc biệt là cũ. Có rất nhiều (nhiều, nhiều) thư viện của bên thứ ba ngoài đó để hỗ trợ JSON shim, do đó, đừng để việc thiếu sự chấp nhận hoàn toàn làm bạn sợ hãi - JSON chắc chắn là một tiêu chuẩn "di chuyển" an toàn.
Sẽ không đẹp hơn nếu chúng ta có thể vượt qua đối tượng đó ngay lập tức? Vâng, nhìn chằm chằm vào Firefox 6 (source), dữ liệu bạn chuyển đến một trình xử lý bưu chính có thể là một đối tượng. Đối tượng sẽ được tuần tự, vì vậy có một số mối quan tâm về phía trước đó, nhưng:
var pass_data = {
'name':'Chris',
'id':54,
'action':'do_logout'
};
target_window.postMessage(pass_data, "http://www.example.net");
Một chút đẹp hơn, eh? Thật không may, các phiên bản hiện tại của IE sẽ chỉ xử lý các chuỗi. Tôi không thể tìm thấy bất kỳ cuộc thảo luận nào về các kế hoạch tương lai liên quan đến postMessage
đối với IE 10. Hơn nữa, có một lỗi đã biết trong IE 8/9 mà vi phạm postMessage
cho bất kỳ thứ gì ngoài khung. (source).
Tham gia vào khía cạnh cụ thể của câu hỏi - gọi lại. Trừ khi bạn có thể chuyển cuộc gọi lại bằng tên hàm, không có cách nào để chuyển một hàm; không có chức năng ẩn danh nào cho bạn. Điều này liên quan đến cách dữ liệu thực sự được truyền cho trình xử lý. Trong thực tế, có "không phải là" hỗ trợ cho các đối tượng như dữ liệu, đằng sau hậu trường trình duyệt đang chuyển đối tượng được truyền của bạn thành một chuỗi (serialization).Tất cả những gì đã nói, sau đó, bạn nên hiểu rằng việc truyền một đối tượng hoàn toàn giống với việc sử dụng JSON đến stringify
một đối tượng trước khi vượt qua, chỉ trong trường hợp trước đây trình duyệt đang thực hiện tuần tự hóa riêng của nó (và sau đó không được thực hiện), trong khi với các tuyến đường sau đó là vào bạn để serialize/unserialize.
Những điểm take-away ở đây:
- postMessage vẫn bị hạn chế qua trình duyệt hỗ trợ
- Xu hướng cho các phiên bản mới hơn của trình duyệt tiêu chuẩn phù hợp là cho phép đoạn của các đối tượng, thêm vào chuỗi
- Đối tượng được truyền sẽ được sắp xếp theo thứ tự, vì vậy không có tham chiếu hàm nào được phép
- Hỗ trợ rộng nhất "trong tự nhiên" chỉ dành cho dữ liệu chuỗi, có nghĩa là bạn sẽ phải gắn chuỗi và "đóng gói" dữ liệu của mình như được minh họa ở trên nếu bạn muốn hỗ trợ nhiều ide của đại lý người dùng
- Internet Explorer sẽ làm hỏng mọi kế hoạch bạn đã bao giờ thực hiện (kể cả ngày lễ gia đình)
Tài liệu và tài liệu tham khảo
Không chắc chắn ý bạn là gì; bạn tự do kiểm tra một thông điệp nhận được và có điều kiện gọi mã khác nhau, vv ... – Pointy
Đó là jsut cho đến nay, tôi đã không thấy bất kỳ ví dụ nào về điều đó, và từ những gì tôi đã đọc, postmessage không thể gửi đồ vật hoặc bất cứ thứ gì, có nghĩa là tôi phải mổ xẻ sợi dây ... có vẻ như không sạch lắm. – johnnietheblack