alanlar arası iframe yeniden boyutlandırma


85

Başka bir etki alanından bir iframe'i nasıl yeniden boyutlandırırım

-Düzenle

Bazı çözümler için aşağı kaydırın .. veya bunun nasıl YAPILMAMASI gerektiğini okuyun: D

Saatler süren kod hacklemesinden sonra sonuç, iframe içindeki hiçbir şeye, alanımda işleyen kaydırma çubuklarına bile erişilemiyor. Pek çok tekniği boşuna denedim.

Size zaman kazandırmak için, bu yola girmeyin bile, etki alanları arası iletişim için sendMessages'ı kullanın. Kullandığım HTML <5 için eklentiler var - Güzel bir örnek için aşağıya gidin :)


Son birkaç gündür bir iframe'i bir siteye entegre etmeye çalışıyorum. Diğer taraf geliştirilirken ve API geliştirilirken bu kısa vadeli bir çözümdür (aylar sürebilir ...) Ve bu kısa vadeli bir çözüm olduğu için easyXDM'yi kullanmak istiyoruz - Diğer etki alanına erişimim var ama onlardan bunu yapmalarını istemek yeterince zor p3p başlığını olduğu gibi ekle .....

3 iframe

Bulduğum en yakın çözüm 3 iframe idi - ancak krom ve safarinin aklına geliyor, bu yüzden onu kullanamam.

kromda aç

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

Kaydırma çubuklarını ölçün

Formu yeniden boyutlandırmayı denemek ve yeniden boyutlandırmak için kaydırma yüksekliğinin nasıl kullanılacağına dair başka bir gönderi buldum .. teoride iyi çalışıyor ancak iframe kaydırma yüksekliğini kullanarak düzgün bir şekilde uygulayamadım ..

document.body.scrollHeight

Bu açıkça gövde yüksekliğini kullanır (bu özelliklere erişilemiyor% 100, x-domains belge yüksekliğine değil, istemcilerin canvaz görüntülemesine bağlıdır)

İframe yüksekliğini almak için jquery kullanmayı denedim

$('#frameId').Height()

$('#frameId').clientHeight

$('#frameId').scrollHeight

dönüş değerleri chrome ve ie farklıdır - ya da hiç mantıklı değil. Sorun şu ki, çerçevenin içindeki her şey reddediliyor - kaydırma çubuğu bile ...

Hesaplanmış Stiller

Ancak, iframe'in kromunu inceler ve öğelerini incelersem, bladdy bana iframe içindeki belge boyutlarını gösterir (iframe.heigh almak için jquery x-domain kullanarak - erişim reddedildi) Hesaplanan CSS'de hiçbir şey yok görüntü açıklamasını buraya girin

Şimdi, chrome bunu nasıl hesaplıyor? (düzenleme-tarayıcı, tüm bu ayarları hesaplamak için oluşturma motorunu kullanarak sayfayı yeniden oluşturur - ancak alanlar arası sahtekarlığı önlemek için herhangi bir yere eklenmez .. yani ..)

HTML4

HTML4.x spesifikasyonunu okudum ve orada document.element aracılığıyla salt okunur değerlerin gösterilmesi gerektiğini söylüyor ancak erişimi jquery aracılığıyla reddedildi

Proxy Çerçeve

Bir kullanıcı iframe aracılığıyla oturum açana ve proxy gerçek içerik yerine bir oturum açma sayfası alana kadar, siteye geri vekaletname verip hangisinin sorun olmadığını hesaplama yoluna gittim. Ayrıca bazılarının sayfayı iki kez araması kabul edilemez

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

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

Sayfayı yeniden işleyin

Bu kadar ileri gitmedim ama kaynağa bakacak ve sayfayı kaynak dosyaya göre yeniden işleyecek jscript motorları var. ancak bu jscript'lerin hacklenmesini gerektirir .. ve bu ticari varlıklar için ideal bir durum değildir ... ve bazı invole pure java applet'leri veya server side render

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

http://htmlunit.sourceforge.net/ <-java, jscript değil

http://maxq.tigris.org/


09-2013 GÜNCELLEMESİNİ DÜZENLE

Bütün bunlar HTML5 soketleriyle yapılabilir. Ancak easyXDM, HTML5 dışı şikayet sayfaları için harika bir yedektir.

1. Çözüm Çok Harika Çözüm!

EasyXDM'yi kullanma

Sunucunuzda şu şekilde bir sayfa kurarsınız

<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>

ve arayanların etki alanında sadece intermiedate_frame html ve easyXDM.js'yi aynı yere eklemeleri gerekir. Bir ana klasör gibi - o zaman göreceli dizinlere veya içerilen bir klasöre yalnızca sizin için erişebilirsiniz.

SEÇENEK 1

Tüm sayfalara komut dosyası eklemek istemiyorsanız, 2. seçeneğe bakın!

Ardından, yeniden boyutlandırmanın gerçekleşmesi için ihtiyacınız olan her sayfanın sonuna basit bir jscript ekleyebilirler. Bu sayfaların her birine easyxdm eklemenize gerek yoktur.

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

Gönderdiği parametreleri değiştirdim. Genişliğin düzgün çalışmasını istiyorsanız, diğer alandaki sayfaların, aşağıdakine benzer bir şekilde bir stilde sayfanın genişliğini içermesi gerekir:

<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>

Bu benim için harika çalışıyor. Genişlik dahil edilmezse, çerçeve biraz tuhaf davranır ve ne olması gerektiğini tahmin etmeye çalışır .. ve ihtiyacınız olursa küçülmez.

SEÇENEK 2

Ara çerçeveyi değişiklik yoklaması için değiştirin

Ara çerçeveniz böyle bir şeye benzemelidir ..

    <!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>

Aralık, boyutun değişip değişmediğini kontrol etmek için daha verimli hale getirilebilir ve yalnızca boyut değişiklikleri her 500 ms'de bir mesaj gönderme işlemi gerektirmiyorsa gönderilir. Bu kontrolü uygularsanız, yoklamayı 50 ms'ye kadar değiştirebilirsiniz! iyi eğlenceler


Tarayıcılar arasında çalışın ve hızlı. Harika hata ayıklama özellikleri !!

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

2.Çözüm (Çalışıyor ama harika değil)

Yani temel olarak, diğer alanla karşılıklı bir anlaşmanız varsa, mesaj gönderme işini yürütmek için bir kitaplık ekleyebilirsiniz. Eğer diğer alana erişiminiz yoksa .. Daha fazla hack aramaya devam edin - çünkü bulduğum bunları bulamadım veya tam olarak gerekçelendiremedim.

Yani diğer etki alanı bunları içerecek Baş etiketi

<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>

Club.js'de, aramaları yeniden boyutlandırmak için yaptığım ve şunları içeren bazı özel aramalar var

 $(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 );
  });

Ve sayfanız tüm zor işi yapacak ve güzel bir senaryosu var ...

  //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');
     });

SEÇENEK 3

Artık, etki alanları arası iFrame'leri yeniden boyutlandırmak için küçük bir JS kitaplığıdır, iFrame'in içinde biraz JavaScript olmasını gerektirir, ancak bu yalnızca 2.8k (765 bayt Gzip'lenmiş) yerel JS'dir ve herhangi bir bağımlılığı yoktur. ve ana sayfa tarafından çağrılana kadar hiçbir şey yapmaz. Bu, diğer insan sistemlerinde hoş bir misafir olduğu anlamına gelir.

Bu kod, DOM değişikliklerini tespit etmek için mutationObserver'ı kullanır ve ayrıca yeniden boyutlandırma olaylarını da arar, böylece iFrame içeriğe göre boyutlandırılır. IE8 + ile çalışır.

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


4
easyXDM örneğinin aslında çok daha az kodu var, harici kütüphanelere dayanmıyor ve aynı zamanda eski tarayıcılarda da çalışıyor :) Ve evet, yazar olduğum için önyargılıyım ama yine de ..
Sean Kinsey

EasyXDM'yi denedim, ancak çalışmak için diğer bağlantılara dahili çerçeve taraması yapamadım .. Örnek aradım .. kopan bağlantılar vardı ve örnek sayfa temizlenmedi .. İşe yaradı! ve benim orijinal cevabımdı .. ama bunu kullandım. İç tarama için bir yol gönderebilir misiniz lütfen .. Baktım ve baktım ..
Piotr Kula

@ppumkin, indirme ile birlikte gelen örnek dahili taramayı tamamen destekler. Bozuk bağlantı muhtemelen benim yaptığım bir deneyden kaynaklanıyor, ancak sunucu bir noktada temizlendi ..
Sean Kinsey

1
Yea ona baktı ve baktı: D nedense sitemde çalışamıyordum. Tekrar deneyeceğim.
Piotr Kula

1
Çalışıyor - ancak bu etki alanındaki bir bağlantıya tıklarsam, sayfayı kitaplığınızla birlikte yeniden yüklüyor, ancak herhangi bir mesaj alamıyorum. Nereden geldiklerine bakılmaksızın istekleri nasıl kabul ettirebilirim? Ve bu easyxdm.swf ne için? :)
Piotr Kula

Yanıtlar:


10

Mesele şu ki - bunun için Etki Alanları Arası Mesajlaşmayı kullanmaktan başka bir yol yok çünkü hesaplanan yüksekliği bir alandaki bir belgeden farklı bir etki alanındaki bir belgeye almanız gerekir.

Yani, bunu kullanarak yaparsınız postMessage(tüm moder tarayıcılarda çalışır) veya yeniden boyutlandırma iframe örneğini easyXDM'den uyarlamak için 5 dakika harcarsınız.

Karşı tarafın gerçekten de birkaç dosyayı kendi etki alanına kopyalaması ve belgesine tek bir kod satırı eklemesi gerekiyor ..


Aksine arkadaşım. İframe'i çapraz bir alan sayfasından iframe docuemnt boyutuna ve kaydırma çubuğu olmadan yeniden boyutlandırmanın bir yolunu buldum. biraz hantal ama daha sonra gönderilecek .. çok basit, inanılmaz.
Piotr Kula

evet ... sendmessage jquwery eklentisini kullandım- başka bir hack- yanlış pozitif bulmuş olsam da ..;) iyi ipucu için teşekkürler!
Piotr Kula

Bazen en iyi şey, meslektaşlarınızı dinlemektir - başka hiç kimsenin sahip olmadığı bazı sihirli hileleri keşfetme ihtimaliniz oldukça zayıf :)
Sean Kinsey

Saf vuruş ve ıskalama ile yaptığımın harika olacağını hayal edin. Ama ince: D Teşekkürler
Piotr Kula

Doğru - başka bir şey değilse, en azından denediniz, denediniz ve belki de yeni bir şey öğrendiniz :)
Sean Kinsey

26

Sean'ın bahsettiğine benzer şekilde postMessage'ı kullanabilirsiniz. Iframe'i alanlar arası yeniden boyutlandırmanın farklı yollarını denemek için çok zaman harcadım, ancak David Walsh tarafından yazılan bu harika blog gönderisine rastlayana kadar şansım olmadı: http://davidwalsh.name/window-iframe

Bu benim kodum ve David'in çözümünün bir birleşimidir. Çözümüm, özellikle iframe'leri yeniden boyutlandırmaya yönelik.

Alt sayfada, sayfanın yüksekliğini bulun ve bunu üst sayfaya (iframe'i içeren) iletin. Element_id'yi öğe kimliğinizle değiştirin (html, gövde, her ne ise).

<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

Ana pencerede bu kodu ekleyin. İframe_id'yi iframe kimliğinizle değiştirin:

<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>

Konsolu açarsanız, yüksekliğin konsol günlüğünde yazdırıldığını göreceksiniz. Bu, hata ayıklamada size yardımcı olacaktır, bu yüzden onu orada bıraktım.

En iyisi, Baker


Bu harika çalışıyor ancak IE'de o kadar değil. 2 değişken göndermek zorunda kaldım, ancak IE bir dizi veya nesne ise "verileri" kabul etmeyecek. Ancak, verileri basitçe data = var1 + "|" olarak oluşturdum var2. Üstte, dizeyi | ve 2 okulunuzu geri alın.
dbonneville

5

Buna birçok farklı çözüm aradıktan sonra, birkaç farklı kullanım durumunu hesaba katmak için basit bir küçük kitaplık yazdım. Bir portal sayfasında birden çok kullanıcı tarafından oluşturulan iFrame'i destekleyen bir çözüme ihtiyaç duyduğumda, desteklenen tarayıcı yeniden boyutlandırıldı ve iFrame'den sonra ana sayfa JavaScript yüklemesi ile başa çıkabilir. Ayrıca, genişliğe göre boyutlandırma ve bir geri arama işlevi için destek ekliyorum ve body.margin'in geçersiz kılınmasına izin veriyorum, çünkü muhtemelen bunu sıfıra ayarlamak isteyeceksiniz.

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

İframe kodu, diğer kişilerin sayfalarında iyi bir misafir olması için kendi kendine yeten küçük bir JavaScript'tir.

Komut dosyası daha sonra aşağıdaki mevcut seçeneklerle ana bilgisayar sayfasında başlatılır.

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
        );
    }
});

İyi bir dostum. Kesinlikle çok sayıda insan tarafından kullanılacak bir şey! +1
Piotr Kula

1
uzak etki alanına erişimim yoksa ne yapmalıyım? Teşekkürler
Bala Peterson

@BalaPeterson, uzak etki alanına erişemiyorsanız, tarayıcıdaki güvenlik kısıtlamaları nedeniyle bunu yapamazsınız.
David Bradshaw

0

İframe üzerinde scroll = no kullanmak yerine onu "auto" olarak değiştiriyorum. Sonra, gerçek pencerenin boyutunu alıyorum

$(window).height();

ve bunu iframe yüksekliği özelliği olarak kullanın.

Sonuç şu ki ...

Hiçbir zaman "sayfa" kaydırmasına sahip olmayacağız, yalnızca "iç çerçeve" kaydırma yapacağız. Gezinirken, parşömenin kim olduğu önemli değil, ancak önemli olan yalnızca 1 tane olmasıdır.

Aslında, kullanıcının gezinirken pencereyi yeniden boyutlandırması sorunu var. Bunu çözmek için kullanıyorum:

setInterval(getDocHeight, 1);

Bu çözümün herhangi bir hataya neden olacağını düşündünüz mü? Benim için çalışıyor ve iFrame'de php tarafından oluşturulan dinamik içeriklerim vardı. Gelecekteki hatalardan korkuyorum ...


2
Tabii ki, "iframe" kaydırma her zaman sayfa ile aynı boyutta olacaktır. Böylece, gezinirken, "sayfa" kaydırması olduğunu görürsünüz.
Elton Morais

0

Günümüzde bildiğim sadece 4 çözüm var:

Yalnızca üçüncüsü birçok sorunu çözebilir. Örneğin , duyarlı iFrame oluşturabilirsiniz ; içeriden kapatın yoksa onunla iletişim kurabilirsiniz . Ancak bunu yapmak için Iframe'de iFrame'e ve "üçüncü taraf çerezleri" geçici çözümüne (isteğe bağlı) ihtiyacınız vardır.

Bununla ilgili örnek olarak bir makale oluşturdum: Olay odaklı alanlar arası iFrame


0

'Nesneye uygun' HTML5 niteliklerini incelediniz mi? İframe'i ölçeklendirmek yerine videoyu / resimleri iframe'e ölçeklendirir (5.000 piksel genişliğinde olan orta büyüklükte bir resim alırsanız iyi olur). "Sığdır" seçeneği (diğerleri "kapak" ve "dolgu" dır), en-boy oranlarını korurken kaynağı sığdırmak için bir tür mektup kutusu yaklaşımı kullanır. HTML5'siz görüntüleme için, çok sayıda polyfill mevcut gibi görünüyor. Bu harika, ancak Edge'in sonundaki bir hata, Microsoft'un Yeni Kabusu ile yaklaşık bir yıldır uyumsuz kalmasını sağladı, şimdi: https://github.com/anselmh/object-fit

DÜZENLEME: Alanlar arası sorunları çözmek için, işi her zaman bir Chrome Uzantısı İçerik Komut Dosyasında yapabilirsiniz, çünkü bu, iframe'inizi yapıştırdığınız sayfanın bir parçası olduğunu düşünür.


0

HTTPS başka bir bağlantı, iframe otomatik yüksekliği için yükseklik elde eder

https://-a.com içeriği:

 <!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 iframe içeriği:

<!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>

İş masası:

xcom http> ycom https WORK

xcom https> ycom https WORK

xcom http> ycom http WORK

xcom https> ycom http WORK

Test Çalışması Ekran Görüntüsü


-2

İframe içinde yer alan sayfanın yüksekliğini mi arıyorsunuz? Iframe içeriğinin yüksekliğini kontrol eden ve ardından iframe'in yüksekliğini içeriğin yüksekliğine ayarlayan bazı javascript çalışması var.

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

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

Ancak, bu yalnızca iframe'de gösterdiğiniz sayfa aynı alan adındaysa çalışır. Değilse, gerekli bilgilere erişemezsiniz. Bu nedenle, erişim reddedildi hatası.


Evet bunu zaten denedim. Harika çalışıyor .. Dediğin gibi aynı etki alanında .. Söylesene, bir tarayıcı başlangıçta yüksekliği hesaplarken% 100'ün ne kadar olduğunu nasıl bilir? neden bu değerlere de erişemiyoruz? Chrome bunu, x alan adında bile iframe'deki her sayfa için hesaplanmış stillerde saklar ...
Piotr Kula

Yükseklik, içeriğe ve sahip oldukları özelliklere bağlı olarak hesaplanır. Bir elemanın yüksekliği, çocuklar oluşturulana kadar belirsizdir.
MarioRicalde

o zaman işlenmiş değerleri nasıl alabilirim? Chrome'daki incelemenin yaptığı gibi?
Piotr Kula

-1 çünkü bu, etki alanları arası çalışmıyor, o da bunu istedi.
Sean Kinsey

Değerleri alamazsınız. Denetçi, "tarayıcı uzantısı" düzeyinde izinlere sahip olduğundan ve "farklı bir kökene sahip web sayfası" düzey izinlerine sahip olmadığından bunu yapabilir.
Quentin

-2

Bir iframe'i yeniden boyutlandırmak için işte basit bir komut dosyası:

bu kafaya girer: (bu bir php betiği için yazılmıştır, html için, 'to' ve \ "to '' ...

<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>"

başın sonu

bu vücuda girer (unutmayın, bu bir php betiği için yazılmıştır, html için tüm 'to' ve \ "to '' ...)

<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>

bonus: yukarıda bazı ipuçları var. Php komut dosyası için ayarlandığından, onunla çok şey yapabilirsiniz ... daha fazlasını öğrenmek için, daha fazlasını yapın ...

bunun anahtarı "sizeframe1" .... aynı sayfadaki birden çok "yeniden boyutlandırıcı" için, aynı komut dosyasını kopyalayın ancak iframe'deki kimliği ve baştaki komut dosyasındaki adı ve viyola'yı değiştirin! aynı sayfada birden fazla yeniden boyutlandırıcınız var ... çok iyi çalışıyor!

phun var.


Sorulan asıl soruyu ele aldığınızı sanmıyorum.
Andrew Barber

Evet- Bu, aynı alandaki bir iframe'i yeniden boyutlandırmak için saf bir javascript. JQuery'yi herhangi bir şekilde kullanmak çok daha kolay. Bu, siteler arası çalışmaz ve burada buna izin verecek hiçbir fantezi yoktur. Ve php komut dosyası yazmak diye bir şey yok mu ?!
Piotr Kula
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.