我知道这很疯狂,但是IE可以驱使一个人做疯狂的事情。
这是交易:我们有一个带有内容编辑器Web部件的SharePoint 2007站点。我们有一群用户使用Internet Explorer 8.我们希望将网站保留在IE8 / IE8标准模式中,以便更好地呈现内容。但是,此配置会破坏从C.E. Web部件打开“富文本编辑器”窗口的功能。
如果我们强制IE8进入IE7文档模式或怪癖模式,它可以工作。事实上,其他网上消息人士建议这样做来解决这个问题。但我们真的宁愿让一切都以标准模式运行。
通过一些调试,我们发现问题的根源是在页面上检索Web部件对象时使用document.all.index("<web_part_id>")
JavaScript。在IE8标准中,这将返回一个对象,其中大多数属性为empty,null或undefined;最值得注意的是,id
属性未设置。如果您使用document.getElementById
检索相同的ID,则会返回一个完全填充的对象。同样,如果IE8在标准模式下不,则会返回主要(但不是完全)填充的对象 - 但无论如何都要填充足以避免脚本错误。
所有这些代码看起来都是动态注入到SharePoint页面中,因此排除了简单地替换对document.all
的引用。但是,我们有了重新定义document.all.item
方法以实际调用document.getElementById
的疯狂想法。到目前为止,我们尝试这样做是行不通的,所以也许有人可能会对我们做错的事情有所了解(好吧,这有很多错误,但它是IE和SharePoint,对吧?)。
我们对覆盖的初步尝试如下:
<script type="text/javascript">
document.all.item = function(id) { return document.getElementById(id); }
</script>
此代码位于文档HEAD
中,高于任何其他脚本引用(SharePoint或其他),但它似乎不会取代本机代码。
欢迎思想,想法,建议和批评!
答案 0 :(得分:3)
document.all 是 HTMLCollection ,因此您可以使用HTMLCollection.prototype更改行为:
if(document.all
&& !window.opera
&& typeof HTMLDocument=='object'
&& typeof HTMLCollection=='object')//filter IE8
{
HTMLCollection.prototype.item=
function(id)
{
return((this==document.all)
? document.getElementById(id)//document.all
: this[id]//maintain native behaviour for other collections
);
}
}
答案 1 :(得分:0)
所以你说你不能改变对document.all.item
的引用,因为SP直接将它注入到html中?那么你不能用DOM代替吗?