我正在为SharePoint 2013进行软件开发。其中一部分涉及覆盖SharePoint的文件预览程序(filepreview.debug.js变成myfilepreview.debug.js)。然而,我们在IE8中遇到了问题。在IE9中,一切正常。
在IE8中抛出的错误会导致在我们自定义功能已激活的站点集合中访问任何站点时都会出现错误:"对象不支持此属性或方法"。
经过对此错误的一些研究,似乎IE8根本不支持Object.create。这篇Mozilla Developer文章似乎支持这个理论。当在引发错误的行之前添加这个polyfill代码时,问题得到了解决。
我想这是有道理的,因为它模仿了Object.create的功能,而Object.create在IE8中似乎不受支持。
然而,这很令人困惑,因为SharePoint的文件预览javascript工作得非常好。他们的javascript也使用Object.create。更奇怪的是,我们的javascript中引发错误的代码部分甚至不是我们的代码——而是SharePoint的。直到那时,整个javascript代码实际上与SharePoint的完全相同,除了几行代码。
以下是默认内容,直到出现问题的那一行:
我们的JavaScript代码(到目前为止)与上面的SharePoint JavaScript代码唯一的区别在于我们从开头删除了以下两行,但是将它们添加回去仍然无法解决问题:
所以我的问题是:为什么我在默认的JavaScript中使用同样的函数时没有问题,而在IE8中却出现了Object.create不支持的错误?
编辑:另一个论坛上的用户建议我尝试通过sod注册我的脚本。我已经将其添加到我的代码中,但没有效果。
在IE8中抛出的错误会导致在我们自定义功能已激活的站点集合中访问任何站点时都会出现错误:"对象不支持此属性或方法"。
经过对此错误的一些研究,似乎IE8根本不支持Object.create。这篇Mozilla Developer文章似乎支持这个理论。当在引发错误的行之前添加这个polyfill代码时,问题得到了解决。
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() { }
F.prototype = o;
return new F();
};
}
我想这是有道理的,因为它模仿了Object.create的功能,而Object.create在IE8中似乎不受支持。
然而,这很令人困惑,因为SharePoint的文件预览javascript工作得非常好。他们的javascript也使用Object.create。更奇怪的是,我们的javascript中引发错误的代码部分甚至不是我们的代码——而是SharePoint的。直到那时,整个javascript代码实际上与SharePoint的完全相同,除了几行代码。
以下是默认内容,直到出现问题的那一行:
function $_global_filepreview() {
RegisterSod("mediaplayer.js", "_layouts/15/mediaplayer.js");
RegisterSod("sp.publishing.resources.resx", "/_layouts/15/ScriptResx.ashx?name=sp.publishing.resources&culture=" + STSHtmlEncode(Strings.STS.L_CurrentUICulture_Name));
RegisterSodDep("mediaplayer.js", "sp.publishing.resources.resx");
previewBase = (function() {
ULS7RK:
;
var filePreviewUniqueId = 0;
return {
init: function(ctxT, listItem, extension) {
this.fpId = ++filePreviewUniqueId;
this.fpDomId = "FilePreviewID-" + String(this.fpId);
this.fpCtx = ctxT;
this.fpExtension = extension;
this.fpListItem = listItem;
},
getHtml: function() {
ULS7RK:
;
return ['<div class="js-filePreview-containingElement" id=', StAttrQuote(this.fpDomId), '>', this.getInnerHtml(), '</div>'].join("");
},
getDomId: function() {
ULS7RK:
;
return this.fpDomId;
},
getContainingElement: function() {
ULS7RK:
;
var containingElement = document.getElementById(this.fpDomId);
Sys.Debug.assert(m$.isElement(containingElement), "Containing element has not been rendered yet.");
return containingElement;
},
canRender: function() {
ULS7RK:
;
return true;
},
getLoadingIndicatorHtml: function(customStyle) {
if (m$.isUndefined(customStyle)) {
customStyle = "";
}
return ['<div class="js-filePreview-loading-image" style="width:', this.getWidth(), 'px; height:', this.getHeight(), 'px; line-height:', this.getHeight(), 'px; text-align:center; vertical-align:middle; display: inline-block; ' + customStyle + '">', '<img src="', "/_layouts/15/images/gears_anv4.gif", '" />', '</div>'].join("");
},
hideLoadingIndicator: function() {
ULS7RK:
;
var containingElement = document.getElementById(this.fpDomId);
((m$(containingElement)).find("div.js-filePreview-loading-image")).css({
display: "none"
});
},
getInnerHtml: function() {
ULS7RK:
;
return "";
},
getWidth: function() {
ULS7RK:
;
return null;
},
getHeight: function() {
ULS7RK:
;
return null;
},
onPostRender: function() {
},
onVisible: function() {
},
onHidden: function() {
}
};
})();
//**This is where the "fix" was added originally**
blankPreview = Object.create(previewBase); <--- error is thrown here
我们的JavaScript代码(到目前为止)与上面的SharePoint JavaScript代码唯一的区别在于我们从开头删除了以下两行,但是将它们添加回去仍然无法解决问题:
RegisterSod("sp.publishing.resources.resx", "/_layouts/15/ScriptResx.ashx?name=sp.publishing.resources&culture=" + STSHtmlEncode(Strings.STS.L_CurrentUICulture_Name));
RegisterSodDep("mediaplayer.js", "sp.publishing.resources.resx");
所以我的问题是:为什么我在默认的JavaScript中使用同样的函数时没有问题,而在IE8中却出现了Object.create不支持的错误?
编辑:另一个论坛上的用户建议我尝试通过sod注册我的脚本。我已经将其添加到我的代码中,但没有效果。
RegisterSod("MyFilepreview.debug.js", "_layouts/15/MyFilepreview.debug.js");
Object.create
的第一个参数不是一个可以用new
调用的构造函数,而是一个对象(通常是普通对象),它成为所创建对象的原型。 - EsailijaObject.create(obj)
替换为(function(){var F = function(){};F.prototype=obj;new F();}())
。 - xavierm02