2010-11-09 116 views
4

我正在嘗試使用Ben Almans jquery postmessage來調整iFrame的大小。我或多或少地用不同的服務器和動態內容作爲例子。jquery postmessage不一致性

我已經發布了一個問題到該網站,但它可能是一個太新手問題,實際上回答。

我已經得到它的工作發送郵件作爲跨域,但調整大小隻是沒有工作。我只是重新發布我發佈爲Toby的內容:

我無法讓iFrame在瀏覽器中持續調整大小。這是你遇到過的嗎?我添加了一個時間戳來知道每個函數何時被調用,並且它很奇怪...:
- Firefox工作正常 - childpage在父頁面之前運行。
- Chrome 7將展開,而不是收縮。時間戳=父代之前的子代
- IE 8 ...父代在子代之前運行...!並且每個鏈接上的iframe增加30次。

任何有這方面的經驗嗎?

添加我的代碼參考兩頁:
家長

<html> 
<head> 
<script language="javascript" src="jquery-1.4.2.min.js" type="text/javascript"></script> 
<script language="javascript" src="jquery.ba-postmessage.js" type="text/javascript"></script> 
<script> 
    $(function(){ 

     // Keep track of the iframe height. 
     var if_height, 

     // 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://oslsrv03/cross_remote/cross_remote.htm#' + encodeURIComponent(document.location.href), 
     src = 'http://oslsrv01/crosstest/child_postmessage.html#' + encodeURIComponent(document.location.href), 

     // Append the Iframe into the DOM. 
     iframe = $('<iframe " src="' + src + '" width="100%" height="100" scrolling="no" frameborder="1"><\/iframe>') 
      .appendTo('#zshop'); 

     //alert(src); 

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

     if (!isNaN(h) && h > 0 && h !== if_height) { 
      // Height has changed, update the iframe. 
      iframe.height(if_height = h); 
     } 

     console.log("beskjed mottat og høyden vi fikk er: " + h); 
     var currentDate = new Date() 
     console.log("tid parent: " + currentDate.valueOf()) 

     // An optional origin URL (Ignored where window.postMessage is unsupported). 
     }, 'http://oslsrv01'); 

     // And for good measure, let's send a toggle_content message to the child. 
     $('<a href="#">Show/hide Iframe content - dette sender beskjeden til iframen.<\/a>') 
     .appendTo('#nav') 
     .click(function(){ 
      $.postMessage('toggle_content', src, iframe.get(0).contentWindow); 
      return false; 
     }); 

    }); 
</script> 
</head> 

<body style="background-color:orange"> 
    <div id="nav"></div> 

    <div id="test"> 

     <div id="zshop" style="border: 3px solid red"></div> 

    </div> 

    dette er slutten 
</body> 

兒童

<html> 
<head> 
<script language="javascript" src="jquery-1.4.2.min.js" type="text/javascript"></script> 
<script language="javascript" src="jquery.ba-postmessage.js" type="text/javascript"></script> 
<script> 
    $(function(){ 
     // Get the parent page URL as it was passed in, for browsers that don't support 
     // window.postMessage (this URL could be hard-coded). 
     var parent_url = decodeURIComponent(document.location.hash.replace(/^#/, '')), 
     link; 

     // The first param is serialized using $.param (if not a string) and passed to the 
     // parent window. If window.postMessage exists, the param is passed using that, 
     // otherwise it is passed in the location hash (that's why parent_url is required). 
     // The second param is the targetOrigin. 
     function setHeight() { 
     $.postMessage({ if_height: $('body').outerHeight(true) }, parent_url, parent); 
     //alert("barn sender beskejd og høyden som sendes er: " + $('body').outerHeight(true)); 
     console.log("barn sender beskejd og høyden som sendes er: " + $('body').outerHeight(true)); 
     var currentDate = new Date() 
     console.log("tid child: " + currentDate.valueOf()) 
     }; 

     // Bind all this good stuff to a link, for maximum clickage. 
     link = $('<a href="#">Show/hide content<\/a>') 
     .appendTo('#nav') 
     .click(function(){ 
      $('#toggle').toggle(); 
      $('#stor').toggle(); 
      setHeight(); 
      return false; 
     }); 

     // Now that the DOM has been set up (and the height should be set) invoke setHeight. 
     setHeight(); 

     // And for good measure, let's listen for a toggle_content message from the parent. 
     $.receiveMessage(function(e){ 
     if (e.data === 'toggle_content') { 
      link.triggerHandler('click'); 
     } 
     }, 'http://oslsrv03'); //http://127.0.0.1 
    }); 
</script> 
</head> 

<body style="background-color:white;border: 3px solid black"> 
    <div id="nav"></div> 

    <div id="toggle"> 

     nå fra oslsvr03 
     <div style="height:200px; background-color:blue;"></div> 
    </div> 

    <div id="stor" style="height:800px; background-color:orange; display: none">Denne skal ikke vises hele tiden!!!</div> 

</body> 

回答

3

忘了將doctype添加到iframed內容。現在它在我的測試案例中就像一個魅力。在真實世界的場景中有點不那麼迷人,但我會看到我在那裏做了什麼... ...