thay đổi kích thước iframe giữa nhiều miền


85

Làm cách nào để thay đổi kích thước iframe từ một miền khác

-Biên tập

Cuộn xuống để biết một số giải pháp .. hoặc đọc về cách KHÔNG làm điều này: D

Sau nhiều giờ hack mã - kết luận là không thể truy cập bất kỳ thứ gì bên trong iframe, ngay cả các thanh cuộn hiển thị trên miền của tôi. Tôi đã thử nhiều kỹ thuật nhưng không có kết quả.

Để giúp bạn tiết kiệm thời gian, thậm chí không cần phải đi xuống tuyến đường này, chỉ cần sử dụng sendMessages để liên lạc giữa các miền. Có những plug-in cho HTML <5 mà tôi sử dụng- Hãy xem phần dưới cùng để biết một ví dụ hay :)


Trong vài ngày qua, tôi đã cố gắng tích hợp iframe vào một trang web. Đây là một giải pháp ngắn hạn trong khi bên kia phát triển và API (có thể mất vài tháng ...) Và bởi vì đây là giải pháp ngắn hạn mà chúng tôi đã thực hiện muốn sử dụng easyXDM- Tôi có quyền truy cập vào miền khác nhưng nó đủ khó yêu cầu họ thêm tiêu đề p3p như hiện tại .....

3 iframe

Giải pháp gần nhất mà tôi tìm thấy là 3 iframe - nhưng nó phù hợp với chrome và safari nên tôi không thể sử dụng nó.

mở trong chrome

http://css-tricks.com/examples/iFrameResize/crossdomain.php#frameId=frame-one&height=1179

Đo các thanh cuộn

Tôi đã tìm thấy một bài đăng khác về cách sử dụng scrollheight để thử và thay đổi kích thước biểu mẫu .. về lý thuyết, nó hoạt động tốt nhưng tôi không thể áp dụng nó đúng cách bằng cách sử dụng chiều cao cuộn iframes ..

document.body.scrollHeight

Obvoisly đó sử dụng chiều cao phần thân (không thể truy cập các thuộc tính này 100% dựa trên canvaz hiển thị ứng dụng khách chứ không phải chiều cao tài liệu x-domain)

Tôi đã thử sử dụng jquery để lấy chiều cao iframe

$('#frameId').Height()

$('#frameId').clientHeight

$('#frameId').scrollHeight

trả về các giá trị khác nhau trong chrome và tức là - hoặc hoàn toàn không có ý nghĩa. Vấn đề là mọi thứ bên trong khung đều bị từ chối - ngay cả thanh cuộn ...

Kiểu tính toán

Nhưng nếu tôi kiểm tra và thành phần trong chrome của iframe, nó sẽ hiển thị cho tôi kích thước tài liệu bên trong iframe (sử dụng jquery x-domain để lấy iframe.heigh - quyền truy cập bị từ chối) Không có gì trong CSS được tính toán nhập mô tả hình ảnh ở đây

Bây giờ chrome tính toán điều đó như thế nào? (chỉnh sửa- trình duyệt kết xuất trang bằng cách sử dụng công cụ kết xuất tích hợp của nó để calcualte tất cả các cài đặt này - nhưng không được đính kèm ở bất kỳ đâu để ngăn gian lận giữa nhiều miền .. vì vậy ..)

HTML4

Tôi đã đọc đặc tả của HTML4.x và nó nói rằng ở đó nên có các giá trị chỉ đọc được hiển thị qua document.element nhưng quyền truy cập của nó bị từ chối thông qua jquery

Khung proxy

Tôi đã đi xuống lộ trình proxy trang web trở lại và tính toán xem điều nào là OK .. cho đến khi người dùng đăng nhập thông qua iframe và proxy nhận được trang đăng nhập thay vì nội dung thực. Ngoài ra đối với một số người gọi trang hai lần là không thể chấp nhận được

http://www.codeproject.com/KB/aspnet/asproxy.aspx

http://www.johnchapman.name/aspnet-proxy-page-cross-domain-requests-from-ajax-and-javascript/

Re-Render trang

Tôi đã không đi xa đến mức này nhưng có các công cụ jscript ở đó sẽ xem xét nguồn và kết xuất lại trang dựa trên tệp nguồn. nhưng nó sẽ yêu cầu hack các jscripts đó .. và đó không phải là một tình huống lý tưởng cho các thực thể thương mại ... và một số applet java thuần túy không xâm nhập hoặc kết xuất phía máy chủ

http://en.wikipedia.org/wiki/Server-side_JavaScript

http://htmlunit.sourceforge.net/ <-java không phải jscript

http://maxq.tigris.org/


CHỈNH SỬA CẬP NHẬT 09-2013

Tất cả điều này có thể làm được với các socket HTML5. Nhưng easyXDM là dự phòng tuyệt vời cho các trang khiếu nại không phải HTML5.

Giải pháp 1 Giải pháp rất tuyệt vời!

Sử dụng easyXDM

Trên máy chủ của bạn, bạn thiết lập một trang ở dạng

<html>
<head>
<script src="scripts/easyXDM.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">

    var transport = new easyXDM.Socket(/** The configuration */{
    remote: "http://www.OTHERDOMAIN.com/resize_intermediate.html?url=testpages/resized_iframe_1.html",

    //ID of the element to attach the inline frame to
    container: "embedded",
    onMessage: function (message, origin) {
        var settings = message.split(",");
        //Use jquery on a masterpage.
        //$('iframe').height(settings[0]);
        //$('iframe').width(settings[1]);

        //The normal solution without jquery if not using any complex pages (default)
        this.container.getElementsByTagName("iframe")[0].style.height = settings[0];
        this.container.getElementsByTagName("iframe")[0].style.width = settings[1];
    }
});

</script>

</head>

<body>
    <div id="embedded"></div>
</body>

và trên miền người gọi, họ chỉ cần thêm html intermiedate_frame và easyXDM.js vào cùng một nơi. Giống như một thư mục mẹ - sau đó bạn có thể truy cập các thư mục tương đối hoặc một thư mục chứa chỉ dành cho bạn.

LỰA CHỌN 1

Nếu bạn không muốn thêm tập lệnh vào tất cả các trang, hãy xem tùy chọn 2!

Sau đó, họ có thể chỉ cần thêm một jscript đơn giản vào cuối mỗi trang mà bạn cần thay đổi kích thước. Không cần bao gồm easyxdm trong mỗi trang này.

 <script type="text/javascript">
            window.onload = function(){ parent.socket.postMessage( (parseInt(document.body.clientHeight)) + "," + ( document.body.clientWidth ) );  };
        </script>

Tôi đã sửa đổi các thông số mà nó gửi. Nếu bạn muốn chiều rộng hoạt động bình thường thì các trang trên tên miền khác cần phải bao gồm chiều rộng của trang theo một phong cách sao cho giống với:

<style type="text/css">
            html, body {
                overflow: hidden;
                margin: 0px;
                padding: 0px;
                background-color: rgb(75,0,85);
                color:white;
                width:660px
            }
            a {
            color:white;
            visited:white;
            }
        </style>

Điều này làm việc tuyệt vời cho tôi. Nếu chiều rộng không được bao gồm thì khung hoạt động hơi lạ và đại loại là cố gắng đoán xem nó phải như thế nào .. và sẽ không thu nhỏ lại nếu bạn cần.

LỰA CHỌN 2

Sửa đổi khung trung gian để thăm dò ý kiến ​​các thay đổi

Khung trung gian của bạn sẽ trông giống như thế này ..

    <!doctype html>
<html>
    <head>

        <title>Frame</title>
        <script type="text/javascript" src="easyXDM.js">
        </script>
        <script type="text/javascript">
            var iframe;
            var socket = new easyXDM.Socket({
                //This is a fallback- not needed in many cases
                swf: "easyxdm.swf",
                onReady: function(){
                    iframe = document.createElement("iframe");
                    iframe.frameBorder = 0;
                    document.body.appendChild(iframe);
                    iframe.src = "THE HOST FRAME";
            iframe.onchange = messageBack();

                },
                onMessage: function(url, origin){
                    iframe.src = url;
                }
            });

            //Probe child.frame for dimensions.
            function messageBack(){
                socket.postMessage ( iframe.contentDocument.body.clientHeight + "," + iframe.contentDocument.body.clientWidth); 
            };

            //Poll for changes on children every 500ms.
            setInterval("messageBack()",500); 

        </script>
        <style type="text/css">
            html, body {
                overflow: hidden;
                margin: 0px;
                padding: 0px;
                width: 100%;
                height: 100%;
            }

            iframe {
                width: 100%;
                height: 100%;
                border: 0px;
            }
        </style>
    </head>
    <body>

    </body>
</html>

Khoảng thời gian có thể được thực hiện hiệu quả hơn để theo dõi nếu kích thước thay đổi và chỉ gửi nếu kích thước thay đổi thay vì đăng tin nhắn sau mỗi 500ms. Nếu bạn thực hiện kiểm tra này thì bạn có thể thay đổi mức bỏ phiếu thấp nhất là 50ms! chúc vui vẻ


Làm việc trên nhiều trình duyệt và nhanh chóng. Tính năng gỡ lỗi tuyệt vời !!

Excellent Work to  Sean Kinsey  who made the script!!!

Giải pháp 2 (Hoạt động nhưng không tốt)

Vì vậy, về cơ bản nếu bạn có thỏa thuận chung với miền khác thì bạn có thể thêm thư viện để xử lý sendmessage. Nếu bạn không có bất kỳ quyền truy cập nào vào miền khác .. Hãy tiếp tục tìm kiếm thêm các bản hack- bởi vì tôi không thể tìm thấy hoặc giải thích đầy đủ cho những bản hack này mà tôi đã tìm thấy.

Vì vậy, miền khác sẽ bao gồm những thứ này trong thẻ Head

<script src="scripts/jquery-1.5.2.min.js" type="text/javascript"></script>
<script src="scripts/jquery.postmessage.min.js" type="text/javascript"></script>
<script src="scripts/club.js" type="text/javascript"></script>

Trong club.js chỉ là một số cuộc gọi tùy chỉnh mà tôi đã thực hiện cho các cuộc gọi thay đổi kích thước và chứa ..

 $(document).ready(function () {   
    var parent_url = decodeURIComponent( document.location.hash.replace( /^#/, '' ) ),link;
//Add source url hash to each url to authorise callback when navigating inside the frame.Without this clicking any links will break the communication and no messages will be received
$('a[href]').each(function(){ 
     this.href = this.href + document.location.hash ;
});
//Get the dimensions and send back to calling page.
var h1 = document.body.scrollHeight;
var w1 = document.body.scrollWidth;
$.postMessage({ if_height: h1, if_width: w1 }, parent_url, parent );
  });

Và trang của bạn sẽ làm tất cả công việc khó khăn và có một tập lệnh đẹp ...

  //This is almost like request.querystring used to get the iframe data
  function querySt(param, e) {
         gy = e.split("&");
         for (i = 0; i < gy.length; i++) {
             ft = gy[i].split("=");
             if (ft[0] == param) {
                 return ft[1];
             }
         }
     }


     $(function () {
         // Keep track of the iframe dimensions.
         var if_height;
         var if_width;
         // Pass the parent page URL into the Iframe in a meaningful way (this URL could be
         // passed via query string or hard coded into the child page, it depends on your needs).
         src = 'http://www.OTHERDOAMIN.co.uk/OTHERSTARTPAGE.htm' + '#' + encodeURIComponent(document.location.href),
         // Append the Iframe into the DOM.
         iframe = $('<iframe " src="' + src + '" width="100%" height="100%" scrolling="no" frameborder="0"><\/iframe>').appendTo('#iframe');

         // Setup a callback to handle the dispatched MessageEvent event. In cases where
         // window.postMessage is supported, the passed event will have .data, .origin and
         // .source properties. Otherwise, this will only have the .data property.
         $.receiveMessage(function (e) {
             // Get the height from the passsed data.
             //var h = Number(e.data.replace(/.*if_height=(\d+)(?:&|$)/, '$1'));
             var h = querySt("if_height", e.data);
             var w = querySt("if_width", e.data);


             if (!isNaN(h) && h > 0 && h !== if_height) {
                 // Height has changed, update the iframe.
                 iframe.height(if_height = h);
             }
             if (!isNaN(w) && w > 0 && w !== if_width) {
                 // Height has changed, update the iframe.
                 iframe.width(if_width = w);
             }
             //For debugging only really- can remove the next line if you want
             $('body').prepend("Recieved" + h + "hX" + w + "w .. ");
             // An optional origin URL (Ignored where window.postMessage is unsupported).
           //Here you must put the other domain.com name only! This is like an authentication to prevent spoofing and xss attacks! 
         }, 'http://www.OTHERDOMAIN.co.uk');
     });

LỰA CHỌN 3

Hiện tại, thư viện JS của họ là một thư viện JS nhỏ để quản lý thay đổi kích thước iFrame miền chéo, nó vẫn yêu cầu iFrame phải có một chút JavaScript trong đó, tuy nhiên, đây chỉ là 2,8 nghìn (765 byte được Gzipped) của JS gốc không có bất kỳ phụ thuộc nào. và nó không làm bất cứ điều gì cho đến khi được gọi bởi trang mẹ. Điều này có nghĩa đó là một vị khách tốt trên các hệ thống của người khác.

Mã này sử dụng mutObserver để phát hiện các thay đổi DOM và cũng tìm ra các sự kiện thay đổi kích thước, để iFrame vẫn có kích thước phù hợp với nội dung. Hoạt động trong IE8 +.

https://github.com/davidjbradshaw/iframe-resizer


4
ví dụ easyXDM thực sự có ít mã hơn rất nhiều, không dựa vào các lib bên ngoài và cũng hoạt động trong các trình duyệt cũ hơn :) Và vâng, tôi có thành kiến ​​vì tôi là tác giả, nhưng vẫn ..
Sean Kinsey

Tôi đã thử easyXDM nhưng tôi không thể duyệt khung nội bộ đến các liên kết khác để hoạt động .. tôi đã tìm kiếm các ví dụ .. có các liên kết bị hỏng và trang ví dụ không rõ ràng .. Nó đã hoạt động! và là câu trả lời ban đầu của tôi .. nhưng tôi đã sử dụng cái này. Bạn có thể đăng một cách để duyệt nội bộ được không .. tôi đã xem xét và xem xét ..
Piotr Kula

@ppumkin ví dụ đi kèm với bản tải xuống hỗ trợ đầy đủ duyệt nội bộ. Các liên kết bị phá vỡ có lẽ là để một thử nghiệm tôi đã làm, nhưng máy chủ đã đỏ mặt tại một thời điểm ..
Sean Kinsey

1
Yea nhìn vào cái đó- và nhìn và nhìn: D vì một số lý do tôi không thể làm cho nó hoạt động với trang web của tôi. Tôi sẽ thử lại.
Piotr Kula,

1
Nó hoạt động - nhưng nếu tôi nhấp vào một liên kết trên tên miền đó, nó sẽ tải lại trang - với thư viện của bạn - nhưng tôi không thể nhận được bất kỳ thông báo nào. Làm cách nào để tôi có thể khiến nó chấp nhận các yêu cầu bất kể họ đến từ đâu. Và easyxdm.swf này để làm gì? :)
Piotr Kula

Câu trả lời:


10

Vấn đề là - không có cách nào khác ngoài việc sử dụng Nhắn tin tên miền chéo cho việc này vì bạn cần nhận chiều cao được tính toán từ tài liệu trong một miền sang tài liệu trong một miền khác.

Vì vậy, bạn thực hiện việc này bằng cách sử dụng postMessage(hoạt động trong tất cả các trình duyệt hiện đại) hoặc bạn dành 5 phút để điều chỉnh ví dụ iframe thay đổi kích thước từ easyXDM.

Bên kia thực sự chỉ cần sao chép một vài tệp vào miền của họ và thêm một dòng mã vào tài liệu của họ ..


Ngược lại bạn của tôi. Tôi đã tìm thấy một cách để thay đổi kích thước iframe từ một trang doimain chéo sang kích thước tài liệu iframe và không có thanh cuộn. Nó hơi khó tin nhưng sẽ đăng sau .. nó đơn giản đến mức khó tin.
Piotr Kula

yea ... Tôi đã sử dụng plugin sendmessage jquwery- tôi đã tìm thấy một bản hack khác- false positive ..;) cảm ơn vì mẹo hay!
Piotr Kula

Chà, đôi khi điều tốt nhất là lắng nghe đồng nghiệp của bạn - tỷ lệ cược để bạn phát hiện ra một trò hack ma thuật nào đó mà không ai khác có là khá mỏng :)
Sean Kinsey

Hãy tưởng tượng nếu tôi thực hiện - bởi một cú đánh thuần túy và đánh trượt - sẽ thật tuyệt vời. But yea- slim: D Cảm ơn
Piotr Kula

True - nếu không có gì khác, bạn đã ít nhất cố gắng, thử nghiệm, và có lẽ học được những điều mới mẻ là tốt :)
Sean Kinsey

25

Tương tự như những gì Sean đã đề cập, bạn có thể sử dụng postMessage. Tôi đã dành rất nhiều thời gian để thử các cách khác nhau để thay đổi kích thước iframe với tên miền chéo nhưng không may mắn cho đến khi tôi tình cờ tìm thấy bài đăng trên blog tuyệt vời này của David Walsh: http://davidwalsh.name/window-iframe

Đây là sự kết hợp giữa mã của tôi và giải pháp của David. Giải pháp của tôi đặc biệt hướng đến việc thay đổi kích thước iframe.

Trong trang con, hãy tìm chiều cao của trang và chuyển nó đến trang mẹ (chứa iframe). Thay thế element_id bằng id phần tử của bạn (html, body, bất cứ thứ gì).

<script>
function adjust_iframe_height(){
    var actual_height = document.getElementById('element_id).scrollHeight;
    parent.postMessage(actual_height,"*"); 
    //* allows this to post to any parent iframe regardless of domain
}
</script>

<body onload="adjust_iframe_height();"> 
//call the function above after the content of the child loads

Trên cửa sổ mẹ, hãy thêm mã này. Thay iframe_id bằng ID iframe của bạn:

<script>
// Create IE + others compatible event handler
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

// Listen to message from child window
eventer(messageEvent,function(e) {
  console.log('parent received message!:  ',e.data);
  document.getElementById('iframe_id').height = e.data + 'px';
},false);
</script>

Nếu bạn mở bảng điều khiển, bạn sẽ thấy chiều cao được in trong nhật ký bảng điều khiển. Điều này sẽ giúp bạn gỡ lỗi đó là lý do tại sao tôi để nó ở đó.

Tốt nhất, Baker


Điều này hoạt động tốt nhưng không hoàn toàn nhiều trong IE. Tôi đã phải gửi 2 biến, nhưng IE sẽ không chấp nhận "dữ liệu" nếu nó là một mảng hoặc đối tượng. Tuy nhiên, tôi chỉ tạo dữ liệu dưới dạng data = var1 + "|" var2. Trên cha mẹ, bạn chỉ cần tách chuỗi trên | và lấy lại 2 vars của bạn.
dbonneville

5

Sau khi xem xét rất nhiều giải pháp khác nhau cho vấn đề này, tôi đã kết thúc việc viết một thư viện nhỏ đơn giản để tính đến một số trường hợp sử dụng khác nhau. Vì tôi cần một giải pháp hỗ trợ iFrame do nhiều người dùng tạo trên một trang cổng thông tin, trình duyệt được hỗ trợ thay đổi kích thước và có thể đối phó với việc tải JavaScript của trang chủ sau iFrame. Tôi cũng thêm hỗ trợ định cỡ theo chiều rộng và chức năng gọi lại và cho phép ghi đè body.margin, vì bạn có thể sẽ muốn đặt giá trị này thành 0.

https://github.com/davidjbradshaw/iframe-resizer

Mã iframe chỉ là một JavaScript độc lập nhỏ, để nó trở thành khách mời tốt trên các trang của người khác.

Sau đó, tập lệnh được khởi tạo trên trang chủ với các tùy chọn có sẵn sau đây.

iFrameResize({
    log                    : true,  // For development
    autoResize             : true,  // Trigering resize on events in iFrame
    contentWindowBodyMargin: 8,     // Set the default browser body margin style (in px)
    doHeight               : true,  // Calculates dynamic height
    doWidth                : false, // Calculates dynamic width
    enablePublicMethods    : true,  // Enable methods within iframe hosted page 
    interval               : 32,    // interval in ms to recalculate body height, 0 to disable refreshing
    scrolling              : false, // Enable the scrollbars in the iFrame
    callback               : function(messageData){ // Callback fn when message is received
        $('p#callback').html(
            '<b>Frame ID:</b> '    + messageData.iframe.id +
            ' <b>Height:</b> '     + messageData.height +
            ' <b>Width:</b> '      + messageData.width + 
            ' <b>Event type:</b> ' + messageData.type
        );
    }
});

Đẹp lắm anh bạn. Chắc chắn thứ gì đó sẽ được sử dụng bởi tất cả mọi người! +1
Piotr Kula

1
tôi phải làm gì nếu tôi không có quyền truy cập vào miền từ xa? Cảm ơn
Bala Peterson

@BalaPeterson, nếu bạn không thể truy cập miền từ xa, thì bạn không thể thực hiện việc này do các hạn chế bảo mật trong trình duyệt.
David Bradshaw vào

0

Thay vì sử dụng scroll = no trên iframe, tôi đổi nó thành "auto". Sau đó, tôi nhận được kích thước của cửa sổ thực tế

$(window).height();

và sử dụng nó làm thuộc tính chiều cao iframe.

Chà, kết quả là ...

Chúng tôi sẽ không bao giờ có cuộn "trang", chỉ có cuộn "iframe". Khi bạn điều hướng, không quan trọng cuộn là ai, nhưng quan trọng là chỉ có 1.

Chà, có một vấn đề là người dùng chỉ cần thay đổi kích thước cửa sổ khi đang điều hướng. Để giải quyết điều đó, tôi sử dụng:

setInterval(getDocHeight, 1);

Bạn có nghĩ rằng giải pháp đó sẽ gây ra bất kỳ lỗi nào không? Nó hoạt động với tôi, và trên iFrame, tôi đã có dynamic contect được tạo bởi php. Tôi sợ những lỗi trong tương lai với điều đó ...


2
Tất nhiên, cuộn "iframe" sẽ luôn có cùng kích thước của trang. Vì vậy, trong khi điều hướng, Bạn chỉ thấy nó như là cuộn "trang".
Elton Morais

0

Ngày nay chỉ có 4 giải pháp mà tôi biết:

Chỉ cái thứ ba có thể giải quyết nhiều vấn đề. Ví dụ: bạn có thể tạo iFrame đáp ứng ; đóng nó từ bên trong hoặc bạn có thể giao tiếp với nó . Nhưng để làm được điều đó, bạn cần iFrame trong Iframe và giải pháp thay thế "cookie của bên thứ ba" (tùy chọn).

Tôi đã tạo một bài viết về nó với ví dụ: iFrame miền chéo hướng sự kiện


0

Bạn đã xem xét các thuộc tính HTML5 'object-fit' chưa? Chia tỷ lệ video / hình ảnh theo khung nội tuyến, thay vì chia tỷ lệ khung nội tuyến (tốt nếu bạn lấy một hình ảnh có kích thước trung bình có chiều rộng là 5.000px). Tùy chọn "vừa vặn" (các tùy chọn khác là "bìa" và "lấp đầy") sử dụng cách tiếp cận hộp thư sắp xếp để phù hợp với nguồn trong khi vẫn bảo toàn tỷ lệ khung hình. Để xem bằng HTML5-less ngoài kia, có vẻ như có rất nhiều polyfills có sẵn. Cái này rất tuyệt, nhưng một lỗi trên Edge đã khiến nó không tương thích với New Nightmare của Microsoft trong khoảng một năm, bây giờ: https://github.com/anselmh/object-fit

CHỈNH SỬA: Để giải quyết các vấn đề tên miền chéo, bạn luôn có thể thực hiện công việc trong Tập lệnh nội dung tiện ích mở rộng của Chrome, vì nó cho rằng đó là một phần của trang mà bạn đang gắn iframe của mình.


0

HTTPS một liên kết khác nhận chiều cao để tự động xem xét iframe

https://-a.com nội dung:

 <!DOCTYPE html>
    <html>
    <head>
        <title>Test Page</title>
    </head>
    <body>
        Test Page:
        <hr/>
        <iframe id="iframe" src="https://-b.com" style="width:100%;min-height:600px;border:none;" scrolling="no" ></iframe>
        <script>
        // browser compatibility: get method for event 
        // addEventListener(FF, Webkit, Opera, IE9+) and attachEvent(IE5-8)
        var myEventMethod = 
            window.addEventListener ? "addEventListener" : "attachEvent";
        // create event listener
        var myEventListener = window[myEventMethod];
        // browser compatibility: attach event uses onmessage
        var myEventMessage = 
            myEventMethod == "attachEvent" ? "onmessage" : "message";
        // register callback function on incoming message
        myEventListener(myEventMessage, function (e) {
            // we will get a string (better browser support) and validate
            // if it is an int - set the height of the iframe #my-iframe-id
            if (e.data === parseInt(e.data)) 
                document.getElementById('iframe').height = e.data + "px";
        }, false);
        </script>
    </body>
    </html>

https://-b.com nội dung iframe:

<!DOCTYPE html>
<html>
<head>
    <title>Test Iframe Content</title>
    <script type="text/javascript">
    // all content including images has been loaded
    window.onload = function() {
        // post our message to the parent
        window.parent.postMessage(
            // get height of the content
            document.body.scrollHeight
            // set target domain
            ,"*"
        )
    };
</script>
</head>
<body>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>1
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>2
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>3
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>4
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>5
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>6
</body>
</html>

Bàn làm việc:

xcom http> ycom https CÔNG VIỆC

xcom https> ycom https CÔNG VIỆC

xcom http> ycom http CÔNG VIỆC

xcom https> ycom http WORK

Kiểm tra Ảnh chụp màn hình Công việc


-2

Bạn đang muốn tìm chiều cao của trang có trong iframe? Tôi có một số javascript đang hoạt động để kiểm tra chiều cao của nội dung iframe, sau đó đặt chiều cao của iframe thành chiều cao của nội dung.

var Height = document.getElementById('iFrameId').contentWindow.document.body.scrollHeight;

document.getElementById('iFrameId').height = Height;

Tuy nhiên, điều này chỉ hoạt động nếu trang bạn đang hiển thị trong iframe nằm trên cùng một miền. Nếu không, bạn không thể truy cập thông tin cần thiết. Do đó, lỗi truy cập bị từ chối.


Vâng, tôi đã thử điều đó rồi. Nó hoạt động tuyệt vời .. trên cùng một tên miền như bạn đã nói .. Hãy cho tôi biết- làm thế nào một trình duyệt biết được 100% là bao nhiêu khi ban đầu nó tính toán chiều cao? tại sao chúng ta cũng không thể truy cập những giá trị đó? Chrome lưu trữ dữ liệu này trong các kiểu được tính toán cho mọi trang trong iframe thậm chí cả miền x ...
Piotr Kula

Chiều cao được tính toán tùy thuộc vào nội dung và thuộc tính mà chúng có. Chiều cao của một phần tử là không chắc chắn cho đến khi các phần tử con được hiển thị.
MarioRicalde

sau đó làm cách nào để lấy các giá trị được hiển thị? như thanh tra trong chrome không?
Piotr Kula

-1 vì điều này không hoạt động trên nhiều miền, đó là những gì anh ấy yêu cầu.
Sean Kinsey

Bạn không thể nhận được các giá trị. Người kiểm tra có thể vì nó có quyền cấp "tiện ích mở rộng trình duyệt" chứ không phải cấp quyền "trang web có nguồn gốc khác".
Quentin

-2

Để thay đổi kích thước iframe, đây là một tập lệnh đơn giản:

điều này xuất hiện trong đầu: (điều này được viết cho một tập lệnh php, cho html, hãy thay đổi 'thành "và \" thành' ...

<script type='text/javascript'>
<!--
function resizeIframe(id){
/*
this.obj=obj
//this.obj.width=null
//this.obj.width=window.frames[\"sizeframe1\"].document.body.scrollWidth
this.obj.style.height=\"\" // for Firefox and Opera
setTimeout(\"this.obj.style.height=this.obj.contentWindow.document.body.scrollHeight+(notIE?heightOffset:0)\",10) // setTimeout required for Opera
*/

el=document.getElementById(id)
el.style.height='200px' // for Firefox and Opera
setTimeout('el.style.height=el.contentWindow.document.body.scrollHeight+\"px\"',1) // setTimeout required for Opera
}

// -->
</script>"

cuối đầu

điều này nằm trong nội dung (hãy nhớ rằng điều này được viết cho một tập lệnh php, đối với html, hãy thay đổi tất cả 'thành "và \" thành' ...)

<iframe onload='resizeIframe(this.id)' allowTransparency=\"true\" name='ccpaymentwindow' id='sizeframe1' marginwidth='1' marginheight='1' height='700' width='690' border='0' frameborder='1' scrolling='no' src='ccmslink.php?variable1=" . $variable1 . "'></iframe>

tiền thưởng: có một số gợi ý ở trên. Vì nó được thiết lập cho php scripting, bạn có thể làm rất nhiều điều với nó ... để tìm hiểu thêm, làm thêm ...

chìa khóa của điều này là "sizeframe1" .... đối với nhiều "công cụ thay đổi kích thước" trên cùng một trang, hãy sao chép cùng một tập lệnh nhưng thay đổi id trong iframe và tên trong tập lệnh trong đầu, và viola! bạn có nhiều thay đổi kích thước trên cùng một trang ... nó hoạt động rất tốt!

có phun.


Tôi không nghĩ rằng bạn đang giải quyết câu hỏi thực sự được hỏi.
Andrew Barber

Đúng- Đây là javascript thuần túy để thay đổi kích thước iframe trên cùng một miền. Sử dụng jQuery theo bất kỳ cách nào sẽ dễ dàng hơn nhiều. Điều này sẽ không hoạt động chéo trang web và không có gì lạ mắt ở đây sẽ cho phép nó. Và không có cái gọi là kịch bản php ?!
Piotr Kula,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.