JavaScript Object.create and IE8

本文关键字:IE8 and create Object JavaScript | 更新日期: 2023-09-27 17:54:46

我正在为SharePoint 2013进行软件开发。其中一部分涉及覆盖SharePoint的文件预览程序(filepreview.debug.js变为myfilepreview/debug.js(。然而,我们在IE8中遇到了问题。IE9中一切正常。

IE8中抛出的错误会导致您在激活我们自定义功能的网站集中访问的任何网站出现错误:"对象不支持此属性或方法">

在对这个错误进行了一些研究之后,IE8根本不支持Object.create,这将出现。Mozilla开发者的这篇文章似乎支持这一理论。当问题通过在引发错误的行之前添加这个polyfill代码来解决时,我更加相信这一点:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() { }
        F.prototype = o;
        return new F();
    };
}

我想这是有道理的,因为它模仿了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

SharePoint javscript(上面(和我们的(到目前为止(之间的唯一区别是,我们从一开始就删除了以下两行,尽管将它们添加回来仍然不能解决问题:

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");

所以我的问题是:为什么我会收到这样的错误,即IE8中不支持Object.create,而在默认javascript中使用相同的函数却没有问题?

编辑:另一个论坛上的一位用户建议我尝试通过sod注册我的脚本。我在我的代码中添加了这个,但没有效果:

RegisterSod("MyFilepreview.debug.js", "_layouts/15/MyFilepreview.debug.js");

JavaScript Object.create and IE8

尝试在IE中调试,并在SharePoint的默认JavaScript文件中设置断点。你确定默认JavaScript中Object.create的实例真的被击中了吗?

他们没有使用带有正确参数的Object.create

当应该是Object.create({name:{value:value}})时,他们使用Object.create({name:value})

所以他们可能定义了自己的Object.create,他们的代码在你的代码之后使用,所以当他们的代码运行时,你已经设置了Object.create,他们可能会像你一样测试存在性,并假设这是他们的版本,而实际上它是你的。

因此,在他们的代码中检查Object.create的定义,并检查脚本的执行顺序。