2011-07-26 35 views
9

Tôi đang phát triển một ứng dụng Facebook sử dụng backbone.js 0.3.3 và đang cố gắng đưa nút quay lại hoạt động bình thường cho người dùng.Thêm trạng thái lịch sử trong ứng dụng Facebook backbone.js (trong khung nội tuyến)

Xương sống lưu trạng thái thông qua hàm băm URL, được sử dụng để định tuyến nội bộ. Ví dụ: #home sẽ tải trang chủ và #session là một trang khác. Lịch sử được lưu khi điều này xảy ra bên ngoài khung nội tuyến, vì vậy bạn có thể điều hướng chính xác bằng cách sử dụng nút quay lại.

Điều hướng bên trong khung nội tuyến không phải là vấn đề và tất cả các liên kết đều hoạt động, nhưng không có lịch sử nào được lưu bởi trình duyệt.

Câu hỏi đặt ra:

Những điểm iframe Facebook để http://app.example.com, đó là ứng dụng Backbone. Làm cách nào để có nút quay lại hoạt động cho người dùng trên ứng dụng Facebook? Điểm thưởng cho giải pháp hiện có sử dụng Backbone.


Tôi đã xem xét câu hỏi này từ nhiều góc độ và không thể tìm thấy giải pháp thỏa đáng có sẵn ở bất kỳ đâu. Có vẻ như rất ít ứng dụng Facebook sử dụng xương sống/dựa rất nhiều vào Javascript.

Tôi nghĩ rằng giải pháp là thêm trạng thái lịch sử vào cửa sổ chính của iframe, nhưng tôi không biết cách thực hiện điều đó. Lịch sử HTML5? Một số loại Facebook API? Ngay cả một giải pháp một phần (cho các trình duyệt hiện đại) là thích hợp hơn với tình hình hiện tại.

+0

Bạn đã kiểm tra xem url iframe có thực sự có băm như '# home' trong khi điều hướng của người dùng không? Bởi vì trong khung nội tuyến, Facebook chiếm đoạt rất nhiều API JavaScript nên tôi không chắc liệu window.location có bị tấn công hay không. –

+0

@Cat Chen: Thuộc tính iframe 'src' được đặt thành 'javascript:" "' và tôi đang gặp khó khăn khi tìm URL thực sự cho khung nội tuyến bằng cách sử dụng bảng điều khiển dành cho nhà phát triển Chrome (Tôi nghĩ chính sách tên miền chéo là thủ phạm) . – Wylie

+0

Tôi hiểu. Tôi có một lời giải thích (xem câu trả lời của tôi), nhưng tôi chưa có giải pháp. –

Trả lời

3

Tôi cho rằng ứng dụng Facebook của bạn nằm trong hộp cát mà họ gọi là Canvas. Bởi vì nó là một sandbox, nó không phải là một iframe trực tiếp với mã nguồn từ trang web của bạn. Thực tế là, Facebook đọc mã nguồn từ trang web của bạn, đặt nó vào hộp cát của họ và hiển thị hộp cát trong khung nội tuyến.

Tôi không chắc liệu điều này có đúng hay không. Trong các ứng dụng Facebook cũ, trong sandbox này, nhiều JavaScript API bị tấn công. Ví dụ: document.getElementById không phải là bản gốc document.getElementById. Đó là một cái gì đó khác, mà chỉ có thể lấy các phần tử bên trong sandbox. Họ đảm bảo rằng hầu hết tất cả các API JavaScript bạn sẽ sử dụng sẽ hoạt động như bạn mong đợi nhưng không có khả năng tiếp cận bất kỳ đâu bên ngoài hộp cát.

Một vấn đề là họ không giả lập hành vi window.location ban đầu. Tôi nghĩ đó là bởi vì họ hy vọng rằng nó sẽ nằm ngoài phạm vi của bạn. Ứng dụng của bạn sẽ nằm trong canvas (hộp cát) và hộp cát sẽ tồn tại trong khung nội tuyến. Vì vậy, khung nội tuyến phải là thứ gì đó ngoài tầm với của bạn.

Tôi không có ý tưởng triển khai hỗ trợ API lịch sử trong Facebook Canvas cho đến thời điểm này. Vì toàn bộ trang bị chiếm đoạt bởi Facebook và bạn không thể đặt bất kỳ thứ gì trong miền của Facebook, trang của bạn thực sự nằm trong miền mà bạn không thể kiểm soát. Với một tình huống như thế này, tôi không thể nghĩ ra một giải pháp khả thi cho đến giờ.

+0

Đây là một lời giải thích tốt, nó không phải là một cái gì đó tôi đã nhận thức được nhưng có khả năng có thể giải thích lý do tại sao lịch sử không được lưu. Tôi vẫn muốn một giải pháp cho phép chúng ta có lịch sử, nhưng nếu không thể, tôi sẽ ngừng cố gắng thêm chức năng mà Facebook hạn chế. – Wylie

+0

Bạn có thể đặt khung nội tuyến bên trong canvas không? Nếu có thể, bạn có thể thử ghi lại lịch sử bằng iframe đó. –

+0

@ Jeff: Bạn có thể xây dựng được không? Tôi biết về các hạn chế tên miền chéo trên iframe, nhưng trong nhiều trường hợp iframe _can_ lưu lịch sử. – Wylie

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