【发布时间】:2013-03-28 00:40:37
【问题描述】:
不寻找使用框架 XXX 答案
此问题并非旨在通过框架找到实用的解决方案。用使用framework XXX回答,或者这在framework XXX里这么简单,或者为什么不用这个framework XXX???不回答问题。
我有一个要在页面加载后运行的函数:performShim。此函数遍历 DOM 中所有带有 span 标签的元素,检查它们是否有 className 或 shim,如果有,则调用 shim,将匹配元素的引用传递给它。
我的目标是添加另一个包含iframe 的span 到传递给shim 的元素。
使用到目前为止我编写的代码,我能够追加 到元素的父级就好了。但是,如果我注释掉 append 行并尝试使用 prepend 行,浏览器可能会陷入无限循环。
这对我来说并不明显。
function shim( element ) {
var iframe = document.createElement('iframe');
iframe.setAttribute( 'frameborder', '0' );
iframe.setAttribute( 'scrolling', 'no' );
iframe.setAttribute( 'align', 'bottom' );
iframe.setAttribute( 'marginheight', '0' );
iframe.setAttribute( 'marginwidth', '0' );
iframe.setAttribute( 'src', "javascript:'';" );
var span = document.createElement('span');
span.appendChild(iframe);
//element.parentNode.insertBefore(span,element); //causes infinite loop?
element.parentNode.appendChild(span); //this line works OK
var els = element.style;
var originalVisibility = els.visibility;
var originalPosition = els.position;
var originalDisplay = els.display;
els.visibility = 'hidden';
els.position = 'absolute';
els.display = 'inline';
var width = element.offsetWidth;
var height = element.offsetHeight;
els.display = originalDisplay;
els.position = originalPosition;
els.visibility = originalVisibility;
iframe.style.width = (width-6) + 'px';
iframe.style.height = (height-6) + 'px';
}
function performShim() {
var children = document.getElementsByTagName("span");
for( var i = 0; i < children.length; i++ ) {
if( children[i].className == "shim" ) {
shim(children[i]);
}
}
}
【问题讨论】:
-
This question is not intended for finding a practical solution那就发错地方了。 -
@LightnessRacesinOrbit:你通过框架忽略了[...],这是一个完全有效的需求。
-
对不起,这个问题是为了更好地理解 DOM 和 DOM 相关的纯 JavaScript 函数,而不是更好地理解框架如何让你的生活更轻松。我对给出的答案非常满意。
-
@Felix:你忽略了我史诗般的幽默
-
@LightnessRacesinOrbit:也许我的幽默检测被看似与您的评论相关的微小接近投票蒙蔽了。道歉,没有难过的感觉;)
标签: javascript dom internet-explorer-6 infinite-loop