2010-04-28 31 views
13

Tôi có một trang có chứa một iframe đó được nạp sử dụng Javascript:Javascript vấn đề với iframe đó là ẩn trước khi nạp

index.html

<iframe id="myFrame" width="800" height="600" style="display: none;"></iframe> 
<div id="loader"><!-- some loading indicator --></div> 

<script type="text/javascript"> 
function someFunction() { 
    var myFrame = document.getElementById('myFrame'); 
    var loader = document.getElementById('loader'); 

    loader.style.display = 'block'; 

    myFrame.src = 'myFrame.html'; 
    myFrame.onload = function() { 
    myFrame.style.display = 'block'; 
    loader.style.display = 'none'; 
    }; 
} 
</script> 

Các trang đó được nạp trong iframe chứa một số logic Javascript tính toán kích thước của các phần tử nhất định cho mục đích thêm thanh cuộn JS (jScrollPane + jQuery Dimensions).

myFrame.html

<div id="scrollingElement" style="overflow: auto;"> 
    <div id="several"></div> 
    <div id="child"></div> 
    <div id="elements"></div> 
</div> 

<script type="text/javascript"> 
$(document).load(function() { 
    $('#scrollingElement').jScrollPane(); 
}); 
</script> 

này hoạt động trong Chrome (và các trình duyệt Webkit lẽ khác), nhưng thất bại trong Firefox và IE vì lúc jScrollPane được gọi, tất cả các yếu tố này vẫn invisble và jQuery Thứ nguyên không thể xác định thứ nguyên của bất kỳ phần tử nào.

Có cách nào để đảm bảo iframe của tôi hiển thị trước khi$(document).ready(...) được gọi? Ngoài việc sử dụng setTimeout để trì hoãn jScrollPane, điều mà tôi chắc chắn muốn tránh.

+0

Tại sao không chỉ cần sử dụng javascript từ trang trực tiếp? –

+1

@ChibuezeOpata điều này đã được hơn 5 năm trước vì vậy tôi không thể thực sự nhớ, nhưng tôi biết có một lý do chính đáng cho nó :-) – Aistina

Trả lời

11

Một số trình duyệt giả định rằng khi "hiển thị: không có" được áp dụng cho các phần tử được thay thế (như Flash hoặc khung nội tuyến), thông tin hình ảnh cho yếu tố đó không còn cần thiết nữa. Vì vậy, nếu phần tử sau đó được hiển thị bởi CSS, trình duyệt sẽ thực sự tạo lại hình thức dữ liệu trực quan.

Tôi tưởng tượng rằng có iframe mặc định là "display: none;" làm cho trình duyệt bỏ qua việc hiển thị HTML để các thẻ không có bất kỳ thứ nguyên nào. Tôi sẽ đặt khả năng hiển thị thành "ẩn" hoặc định vị nó khỏi trang thay vì sử dụng "display: none;".

Chúc may mắn.

5

thay vì làm các iframe vô hình bằng cách sử dụng display:none, bạn có thể thử ...

... thiết visibility:hidden

... thiết position:absolute; top:-600px;

... thiết opacity:0

hoặc thứ gì đó khác khiến jQuery "xem" các đối tượng nhưng không phải là người dùng (và đặt lại các thuộc tính css được sử dụng trong hàm myFrame.onload).

+0

Ngoài ra, z-index: -1 – Dan

-2

Khung nội tuyến ẩn là một vấn đề bảo mật lớn. Có lẽ tốt nhất là cố gắng tìm cách khác để hoàn thành những gì bạn muốn, nếu nó là hợp pháp, bởi vì hy vọng các trình duyệt trong tương lai sẽ loại bỏ hoàn toàn tính năng này. http://blog.opendns.com/2012/07/10/opendns-security-team-blackhole-exploit/

+0

Hoàn toàn không hữu ích, trước hết, làm thế nào có thể "không sử dụng iframe" ngăn chặn kẻ xấu khai thác lỗ hổng bảo mật của iframe anyway (?!?). Và yêu cầu anh ta chờ các nhà phát triển web không thể nhìn thấy, nơi mà tất cả các trình duyệt chỉ hỗ trợ "những thứ thực" cũng không giúp được gì. –

0

visibility:collapse; display:hidden; height:0px;

Sẽ làm việc để thoát khỏi không gian trắng quá .. Iframe cũng sẽ được tải ..

+0

hiển thị: bị ẩn? Tôi biết "khả năng hiển thị: ẩn", tôi không thấy hiển thị: ẩn trong tài liệu: http://www.w3schools.com/cssref/pr_class_display.asp –

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