私は次の構造を持っています:
0. Parent page
1. iFrame rendered through ad delivery network
2. iFrame displaying the advertisement
広告は、ユーザーが広告を操作したときに、parentIFrame.size() メソッドを介して親 iFrame のサイズを変更するように設定されています。このパーツのセットアップが完了し、適切に動作しています。レベル 2 の iframe でインライン スタイル属性が変更されていることがわかります。
デモを見ると、ネストされた iFrame を連携させ、ネストされたレベル間でサイズを適切に調整できることがわかります。contentWindow と iFrameResize ファイルの両方を持つ中間レベルの iFrame をセットアップする必要があることがわかりました。
レベル 2 の iframe が機能し、適切にサイズ変更されていることを考えると、レベル 1 とレベル 2 の間の通信は適切に機能しており、問題はレベル 0 とレベル 1 の間のどこかにあると想定しています。レベル 2 内でiFrameResize のログがオフになりました。
コンソールを表示すると、広告がレンダリングされると次のようになります。
[iFrameSizer][Host page] IFrame scrolling disabled for sas_i30430
[iFrameSizer][Host page][init] Sending msg to iframe (sas_i30430:8:false:true:32:true:true:null:offset:null:null:0)
[iFrameSizer][Host page][iFrame.onload] Sending msg to iframe (sas_i30430:8:false:true:32:true:true:null:offset:null:null:0)
[iFrameSizer][sas_i30430] HTML & body height set to "auto"
[iFrameSizer][sas_i30430] Enable public methods
[iFrameSizer][sas_i30430] Enable MutationObserver
[iFrameSizer][sas_i30430] Trigger event lock on
[iFrameSizer][sas_i30430] Sending message to host page (sas_i30430:250:300:init)
[iFrameSizer][Host page] Received: [iFrameSizer]sas_i30430:250:300:init
[iFrameSizer][Host page] Checking height is in range 0-Infinity
[iFrameSizer][Host page] Checking width is in range 0-Infinity
[iFrameSizer][Host page] Requesting animation frame
level 2. registering handler -- resizing to 250, 300
[iFrameSizer][Host page] IFrame (sas_i30430) height set to 250px
[iFrameSizer][sas_i30430] Trigger event: mutationObserver: [object HTMLIFrameElement] attributes
[iFrameSizer][sas_i30430] No change in size detected
[iFrameSizer][sas_i30430] Trigger event lock off
[iFrameSizer][sas_i30430] --
次に、広告をクリックすると、次のように表示されます。
level 2. expand action -- resizing to 250, 482
[iFrameSizer][sas_i30430] Trigger event: mutationObserver: [object HTMLIFrameElement] attributes
[iFrameSizer][sas_i30430] No change in size detected
ログをセグメント化するために、レベル 2 からイベントをログに記録していることがわかります。レベル 2 の iFrame のサイズが変更された最後の部分ですが、レベル 1 の iFrame でサイズの変更が見られないのは、切断されている場所です。
レベル 0 には次のものがあります。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="http://cachicha.tv/utils/ads/rich-media/assets/js/iframeResizer.min.js"></script>
<script>
jQuery(function($) {
$('.adunit').find('iframe').iFrameResize({
log: true,
checkOrigin: false,
autoResize: true,
enablePublicMethods: true,
});
});
</script>
レベル 1 には次のものがあります (これは奇妙ですが、広告ネットワークには必要です... この部分は機能しています。完全を期すために提供しています):
<script type="text/javascript">
var scripts = [
"http://cachicha.tv/utils/ads/rich-media/assets/js/iframeResizer.min.js",
"http://cachicha.tv/utils/ads/rich-media/assets/js/iframeResizer.contentWindow.min.js"
];
var jQueryScriptLoaded = function() {
// load the other scripts after jquery
for (var i = scripts.length - 1; i >= 0; i--) {
var element = document.createElement("script");
element.onload = function() {
scriptsLoaded();
};
element.src = scripts[i];
document.getElementsByTagName('head')[0].appendChild(element);
};
};
var scriptsLoaded = function() {
// fire jquery onces all scripts are loaded in the right order
jQuery(function($) {
$('iframe').prop('width', '').prop('height', "100%");
$('iframe').iFrameResize({
// log : true, // Enable console logging
enablePublicMethods : true, // Enable methods within iFrame hosted page
sizeHeight : true,
sizeWidth : true,
checkOrigin : false,
autoResize : false,
});
});
}
// load jquery first.
var jqueryScript = document.createElement('script');
jqueryScript.onload = function() {
jQueryScriptLoaded();
};
jqueryScript.src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(jqueryScript);
</script>
レベル 2 には contentWindow スクリプトと parentIFrame.size() 呼び出しがあります。
ご協力いただきありがとうございます。