我正在尝试根据 iFrame 中的内容通过一些 javascript 动态调整网页上 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
这真的是真的吗?它与页面生命周期有关吗?
附言。我猜 javascript 代码是无关紧要的,因为我们不能正常工作。
更新:我认为这可能与安全 http (https) 和不同的浏览器以某种奇怪的方式有关。我注意到该脚本实际上在 Firefox 中工作。或者更确切地说,我不确定它是否是脚本,或者只是 Firefox 的根据内容自动调整 iframe 大小的功能。虽然它没有给我任何错误。如果我随后将 https 添加到脚本 url 引用中,则脚本可以在 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>
使用 HTTP 作为 url 它在 IE 和 FF 上的工作 - 不是 chrome。如果我将它设置为 HTTPS,它可以在 chrome 和 IE 上运行——不是 FF。相同的错误“ReferenceError:未定义 FrameManager”。这到底是怎么回事?