IE8 / JavaScript:覆盖document.all.item的本机实现?

时间:2011-06-08 22:28:55

标签: javascript sharepoint-2007 internet-explorer-8

我知道这很疯狂,但是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或其他),但它似乎不会取代本机代码。

欢迎思想,想法,建议和批评!

2 个答案:

答案 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代替吗?

顺便说一句,我觉得你的SharePoint很痛苦。我已经建立了SP工作流程,这对我来说足够痛苦了!