javascript を介して iFrame 内のコンテンツに応じて、Web ページ上の iFrame の高さを動的に調整しようとしています。私の問題は、<script>
タグ内のページにスクリプトを直接配置すると、正常に機能することです。コードを別のjsファイルに詰め込んでリンクすると、機能しません!
<iframe id='StatusModule' onload='FrameManager.registerFrame(this)' src='http://randomdomain.dk/StatusModule.aspx'></iframe>
<script type='text/javascript' src='http://randomdomain.dk/FrameManager.js'></script>
それは私にエラーを与えます: Uncaught ReferenceError: FrameManager is not defined
これは本当に真実でしょうか?ページのライフサイクルと関係がありますか?
Ps。JavaScriptコードは機能しないため、無関係だと思います。
更新:これは、セキュア http (https) とさまざまなブラウザーに何らかの奇妙な方法で関係している可能性があると思います。スクリプトが実際にFirefoxで機能することに気付きました。それとも、スクリプトなのか、コンテンツに応じて iframe のサイズを自動的に変更する Firefox の機能なのかはわかりません。ただし、エラーは発生しません。次に、スクリプトの URL 参照に https を追加すると、スクリプトは IE と chrome で機能しますが、Firefox では機能しません。関数参照エラー! なんてこった。これは奇妙になりました!
更新 #2: iframe のサイズを変更する FF 関数ではありません。機能する実際のスクリプトです(httpsなし)。
更新 #3: JavaScript。スクリプトタグに直接入れるとうまくいきます。
var FrameManager = {
currentFrameId: '',
currentFrameHeight: 0,
lastFrameId: '',
lastFrameHeight: 0,
resizeTimerId: null,
init: function () {
if (FrameManager.resizeTimerId == null) {
FrameManager.resizeTimerId = window.setInterval(FrameManager.resizeFrames, 0);
}
},
resizeFrames: function () {
FrameManager.retrieveFrameIdAndHeight();
if ((FrameManager.currentFrameId != FrameManager.lastFrameId) || (FrameManager.currentFrameHeight != FrameManager.lastFrameHeight)) {
var iframe = document.getElementById(FrameManager.currentFrameId.toString());
if (iframe == null) return;
iframe.style.height = FrameManager.currentFrameHeight.toString() + "px";
FrameManager.lastFrameId = FrameManager.currentFrameId;
FrameManager.lastFrameHeight = FrameManager.currentFrameHeight;
window.location.hash = '';
}
},
retrieveFrameIdAndHeight: function () {
if (window.location.hash.length == 0) return;
var hashValue = window.location.hash.substring(1);
if ((hashValue == null) || (hashValue.length == 0)) return;
var pairs = hashValue.split('&');
if ((pairs != null) && (pairs.length > 0)) {
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
if ((pair != null) && (pair.length > 0)) {
if (pair[0] == 'frameId') {
if ((pair[1] != null) && (pair[1].length > 0)) {
FrameManager.currentFrameId = pair[1];
}
} else if (pair[0] == 'height') {
var height = parseInt(pair[1]);
if (!isNaN(height)) {
FrameManager.currentFrameHeight = height;
//FrameManager.currentFrameHeight += 5;
}
}
}
}
}
},
registerFrame: function (frame) {
var currentLocation = location.href;
var hashIndex = currentLocation.indexOf('#');
if (hashIndex > -1) {
currentLocation = currentLocation.substring(0, hashIndex);
}
frame.contentWindow.location = frame.src + '&frameId=' + frame.id + '#' + currentLocation;
}
};
window.setTimeout(FrameManager.init, 0);
更新 #4: ShadowWizard と TheZuck が提案したとおりにしました。
<script type="text/javascript">
var iframe = document.createElement("iframe");
iframe.src = "http://www.randomdomain.dk/StatusWebModule.aspx";
iframe.width = '100%';
iframe.id = 'StatusModule';
iframe.scrolling = 'no';
if (iframe.attachEvent) {
iframe.attachEvent("onload", function () {
FrameManager.registerFrame(iframe);
});
} else {
iframe.onload = function () {
FrameManager.registerFrame(iframe);
};
}
document.getElementById('framecontainer').appendChild(iframe);
</script>
URL として HTTP を使用すると、IE および FF で動作します - クロムではありません。HTTPS に設定すると、Chrome と IE で動作します - FF ではありません。同じエラー「ReferenceError: FrameManager が定義されていません」。ここで一体何が起こっているのですか?