8

Sự tiến thoái lưỡng nan mà tôi đang xử lý là trong số jquery-bbq code, vì IE6 và IE7 không hỗ trợ hashchange, họ tải trang hai lần để có trạng thái lịch sử.Có cách nào tiêu chuẩn để xác định href mở trong cuộc gọi document.open không?

Điều này có tác động tiêu cực vì mã chạy hai lần ở cả phía máy chủ và phía máy khách. Phương pháp được sử dụng để tạo khung nội tuyến là:

if (is_old_ie) { 

    // Create hidden IFRAME at the end of the body. 
    iframe = $('<iframe src="javascript:0"/>').hide().appendTo('body')[0].contentWindow; 

    // Get history by looking at the hidden IFRAME's location.hash. 
    get_history = function() { 
     return get_fragment(iframe.document.location.href); 
    }; 

    // Set a new history item by opening and then closing the IFRAME 
    // document, *then* setting its location.hash. 
    set_history = function(hash, history_hash) { 
     if (hash !== history_hash) { 
     var doc = iframe.document; 
     doc.open().close(); 
     doc.location.hash = '#' + hash; 
     } 
    }; 

    // Set initial history. 
    set_history(get_fragment()); 
    } 

Khung nội tuyến trống có src là javascript:0 được tạo. Phương thức document.open được gọi và có vẻ như nó lấy location.href của cửa sổ chính làm mặc định cho trang mở với .open.

Tôi về cơ bản phải sửa đổi mã để nó không mở cùng một url hai lần, vì vậy tôi đang tìm cách ghi đè mặc định và chỉ định tham số chẳng hạn như? Iframe = true.

Ví dụ:

http://example.com/views/step-2?one=two

Trong IE, trang trên được nạp và sau đó được nạp lại trong một iframe. Mã phía máy chủ thực hiện hai lần, nhưng tôi không muốn điều đó xảy ra.

Tôi muốn nối thêm &iframe=1 vào URI để tôi có thể ngăn mã phía máy chủ chạy nếu thông số iframe được chỉ định.

Hai điều rõ ràng nhất là:

  1. Đặt src của iframe, nhưng điều này có thể có một tác động tiêu cực và tôi khá chắc chắn rằng nó ở đó vì một lý do.
  2. Thay vì sử dụng document.open.close, hãy sử dụng iframe.location.href và đặt thành href theo cách thủ công.

Nếu bất kỳ ai có kinh nghiệm về hack khung nội tuyến, tôi rất cảm kích một số mẹo.

EDIT: Một workaround tôi nghĩ sẽ được tải một trang thông qua iframe/ajax mà bộ một var phiên trước iframe hiện document.open, mà tạo ra một biến phiên họp của 'iframeloading' tương đương với 1, và thiết lập một xử lý sự kiện tải trên tải iframe để đặt nó trở lại 0, và điều chỉnh mã server-side của tôi để không thực hiện nếu var phiên được thiết lập để 1. một cái gì đó như:

$('<iframe src="/iframe-loading.php"/>').hide().appendTo('body'); 
document.open().close() 
$(document.defaultView).load(function() { 
    $('<iframe src="iframe-doneloading.php/>').hide().appendTo('body'); 
}); 
+0

nếu tôi cung cấp cho bạn một cách khác để xử lý sự kiện hashchange với jquery nó colud slove vấn đề của bạn? – ygaradon

+0

Nếu bạn có thể sửa vấn đề hashchange tải hai lần, nó sẽ giúp bạn tiết kiệm rất nhiều thời gian. Tài liệu về jQuery BBQ đề cập đến: "Hãy chắc chắn ràng buộc với sự kiện" hashchange "trên tài liệu.đã có, không phải trước đó, nếu không nó có thể bị lỗi trong IE6/7." Đó không phải là vấn đề của bạn, phải không? Ngoài ra, bạn có thể đăng sự cố của mình lên trang GitHub dự án tại https://github.com/cowboy/jquery-bbq/issues –

Trả lời

1

Giới thiệu "có một tiêu chuẩn cách xác định href mở trong cuộc gọi document.open? "

Không, không có.

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