我想全局重新定义一个createElement方法,但遗憾的是它只能在主文档中使用,并在iframe中被忽略。我们来看这个示例代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script>
old_createElement = document.createElement;
document.createElement = function(el_type) {
new_el = old_createElement.call(this, el_type);
new_el.style.color="red";
return new_el;
};
</script>
</head>
<body bgcolor="white">
<iframe id="iframe1"></iframe>
<script type="text/javascript">
window.setTimeout(function(){
iframe_el = document.getElementById("iframe1").contentDocument.createElement("div");
iframe_el.innerHTML = 'inside iframe';
document.getElementById("iframe1").contentDocument.body.appendChild(iframe_el);
},50);
no_iframe_el=document.createElement('div');
no_iframe_el.innerHTML = 'outside of iframe';
document.body.appendChild(no_iframe_el);
</script>
</body>
</html>
当我在浏览器中打开时,主文档中创建的元素会出现预期的红色,但iframe中的元素为黑色。
问题是我只能控制文档HEAD部分中包含的脚本。换句话说,我不知道HTML源中将会有多少iframe,或者它们将如何成为名称,或者它们是否通过用户的Javascript添加。
我的问题是:如何全局更改方法,以便在iframe中创建的所有元素也使用这种新样式?
非常感谢!
答案 0 :(得分:1)
每个框架都有自己独立的Javascript上下文。如果您想要更改该框架的上下文,则必须专门针对该框架进行更改。
在您的具体示例中,每个框架都有自己的document
对象,因此每个文档都有自己的.createElement
属性应该不足为奇。
你不能以一种会影响所有帧的方式改变事物。而且,事实上如果它是一个跨源框架,你根本无法改变它。