2009-06-01 36 views
20

Tôi đang sử dụng jQuery để kiểm soát chiều cao của khung nội tuyến.Kiểm soát chiều cao iframe bằng jQuery

jQuery("iframe",top.document).contents().height(); 

Điều này hoạt động khi chiều cao của iframe tăng. Khi chiều cao giảm nó không hoạt động. Nó chỉ trả về giá trị cũ. Tại sao chuyện này đang xảy ra?

+0

@ José Basilio - vâng tôi tìm thấy chiều cao của nội dung Iframe và được đặt thành Iframe. – Saravanan

+0

@porneL - Bạn có thể giải thích cách tìm đối tượng hoặc tính năng của Iframe không? – Saravanan

+0

@Saravanan - Vui lòng đọc bài đăng đã chỉnh sửa của tôi. –

Trả lời

4

Nó hoạt động cho tôi Nếu tôi đặt và truy xuất nó mà không cần sử dụng .contents(). Vui lòng xem ví dụ của tôi bên dưới.

function changeFrameHeight(newHeight){ 
    jQuery("iframe",top.document).height(newHeight); 
    alert("iframe height=" + jQuery("iframe",top.document).height()); 
} 

EDIT: Nếu tôi hiểu đúng, bạn đang cố gắng để thoát khỏi các thanh cuộn bằng cách gọi tăng và trở lại chiều cao ban đầu bằng cách gọi giảm.

Sau khi thực hiện nhiều thử nghiệm trên các trình duyệt khác nhau. Đây là mã hoạt động trong FF, IE, Chrome, Safari và Opera.

//first declare a variable to store the original IFrame height. 
var originalHeight = $("iframe",top.document).height(); 

Thay đổi heightIncrement bạn chức năng để sử dụng như sau:

heightIncrement:function(){ 
var heightDiv = jQuery("iframe",top.document).contents().find('body').attr('scrollHeight'); 
jQuery("iframe",top.document).css({height:heightDiv}); 
} 

Thay đổi heightDecrement chức năng của bạn để sử dụng sau đây:

heightDecrement:function(){ 
jQuery("iframe",top.document).css({height:originalHeight}); 
} 
1

Tại thời điểm bốc hàng tôi gọi chức năng này

heightIncrement:function(){  
      if($.browser.mozilla) 
      { 
      var heightDiv = jQuery("iframe",top.document).contents().attr("height")+"px";      
      jQuery("iframe",top.document).css({height:heightDiv}); 
      } 
      else if($.browser.opera || $.browser.safari || $.browser.msie) 
      {    
      var heightDiv = jQuery("iframe",top.document).height();     
      jQuery("iframe",top.document).css({height:heightDiv}); 
      } 
} 

nếu tôi sử dụng mà không có nội dung() thì trả về không.

+0

Bạn nên sử dụng tính năng phát hiện đối tượng/đối tượng địa lý thay vì phát hiện trình duyệt, ví dụ: đọc chiều cao bằng cả hai phương thức và xem kết quả nào tốt. – Kornel

+0

@Saravanan - Có vẻ như bạn đang cố gắng lấy lại chiều cao và sau đó thiết lập lại một điều tương tự. Đúng không? –

+0

Trong ngày hôm nay của JQuery sử dụng $ (".. thay vì jQuery (" .. sẽ làm việc. – nottinhill

30

i sử dụng sau đây và nó hoạt động hoàn hảo ...

$("#frameId").height($("#frameId").contents().find("html").height()); 

tất nhiên chỉ khi nó được gọi là (không có "autoresize") ... nhưng nó hoạt động ngày càng tăng như giảm

+0

Cảm ơn! Sử dụng nó và hoạt động tuyệt vời. – ppumkin

+2

sẽ làm việc này tên miền chéo? – Jacques

+5

Tôi không nghĩ rằng điều này sẽ làm việc với ** cross tên miền **.Xin vui lòng giúp đỡ nếu bạn đã có một giải pháp cho việc này. –

3

Đây là cổ nhưng hy vọng nó sẽ giúp.

Có vẻ như Chrome (hoặc có thể tất cả webkit, không chắc chắn) có lỗi nơi scrollHeight có thể tăng nhưng không giảm (ít nhất là trong trường hợp nội dung trong khung nội tuyến). Vì vậy, nếu nội dung phát triển, sau đó co lại, scrollOffset vẫn ở mức cao hơn. Đó không phải là rất tốt đẹp khi bạn đang cố gắng để làm cho chiều cao của khung nội tuyến chỉ đủ lớn cho nội dung luôn thay đổi của nó.

Cách khắc phục sự cố là làm cho nó tính toán lại chiều cao bằng cách đặt chiều cao thành thứ gì đó đủ nhỏ để chiều cao khung nội tuyến nhỏ hơn nội dung của nó, sau đó scrollHeight được đặt lại.

var frame = top.document.getElementById('iFrameParentContainer').getElementsByTagName('iframe')[0]; 
var body = frame.contentWindow.document.body; 
var height = body.scrollHeight; // possibly incorrect 
body.height = "1px"; 
height = body.scrollHeight; // correct 

Điều này có thể gây ra một chút nhấp nháy nhưng thông thường không, ít nhất, nó hoạt động trên máy (tm) của tôi.

+1

Tôi đã gặp sự cố khi đặt chiều cao thành 1px - đôi khi, tính toán lại sẽ bị tắt. Tôi đã thử 'tự động' như được đề xuất trong [câu trả lời này] (http://stackoverflow.com/a/11864824/385996) và có vẻ như nó hoạt động trong nhiều trường hợp hơn. Nhưng nhìn chung, điều này có vẻ là một cách tuyệt vời để khắc phục lỗi (?) Với Chrome. –

0

Tôi đã định lại kích thước và chiều rộng của iframe thành công khi được tải.về cơ bản bạn có thể làm điều này như dưới đây, và tôi cũng gửi một bài viết nhỏ trên blog của tôi: http://www.the-di-lab.com/?p=280

 

$(".colorbox").colorbox(

{iframe:true, 

innerWidth:0, 

innerHeight:0, 

scrolling:false, 

onComplete:function(){ 

$.colorbox.resize(

{ 

innerHeight:($('iframe').offset().top + $('iframe').height()), 

innerWidth:($('iframe').offset().left + $('iframe').width()) 

} 

); 

} 

} 

); 

0

Nếu nguồn iframe là một tên miền khác với cha mẹ của mình, sau đó có thể bạn sẽ cần phải sử dụng easyXDM.

0

tôi sử dụng này:.

$ ('# iframe') sống ('MouseMove', function (event) {

var theFrame = $ (this, parent.document.body) ;

this.height ($ (document.body) .height() - 350);
});

+0

sẽ 'mousemove' không hiệu quả vì nó được kích hoạt thường xuyên như vậy? –

0

Tôi không chắc liệu mọi người có hài lòng với phương pháp của họ hay không nhưng tôi đã viết một phương pháp rất đơn giản có vẻ hoạt động khá tốt đối với tôi, trong Safari, Chrome, IE9, Opera mới nhất và Firefox.

Tôi đã gặp sự cố khi đổi kích thước một iFrame đã cho lịch google vì vậy tôi vừa tạo kích thước mặc định theo kiểu iFrame: width = "600" và cài đặt chiều cao về cơ bản tối đa tôi muốn, 980 tôi tin, sau đó được bọc trong một container Div với chiều cao và chiều rộng là 100% và min-height và min-width tại 400px và 300px tương ứng, và sau đó thêm một số jQuery để chạy ở onload và onresize ...

 <script> 

     var resizeHandle = function(){ 
      var caseHeight = $('#calendarCase').height(); 
      var caseWidth = $('#calendarCase').width(); 
      var iframeWidth = $('#googleCalendar').width(caseWidth - 10); 
      var iframeHeight = $('#googleCalendar').height(caseWidth - 10);; 
     }; 


</script> 


<body id ="home" onLoad="resizeHandle()" onResize="resizeHandle()"> 

nên để làm rõ, chức năng thay đổi kích thước chạy onLoad vì tôi đang nhắm mục tiêu đặt điện thoại di động và máy tính bảng trong thiết kế đáp ứng, có chiều cao và chiều rộng của div lịch và đặt chiều cao và chiều rộng của khung nội tuyến (#googleCalendar), trừ 10 pixel cho một số đệm.

chỉnh sửa Tôi quên đề cập đến rằng tôi đã sử dụng caseWidth để đặt chiều cao của iFrame để giữ tỷ lệ bị ràng buộc và một nơi nào đó vuông.

này đã làm việc tốt cho đến nay, nếu có ai có bất kỳ ý tưởng tại sao nó có thể không được ổn định xin vui lòng tư vấn,

cổ vũ

1

Đây là một jQuery đơn giản mà làm việc cho tôi. Được thử nghiệm trong iExplorer, Firefox và Crome:

$('#my_frame').load(function() { 
     $(this).height($(this).contents().find("html").height()+20); 
}); 

Tôi thêm 20 pixel chỉ để tránh bất kỳ thanh cuộn nào, nhưng bạn có thể thử giới hạn dưới.

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