c# - JavaScript Object.create 和 IE8

标签 c# javascript sharepoint internet-explorer-8 sharepoint-2013

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

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

在对该错误进行一些研究之后,似乎 IE8 根本不支持 Object.createThis Mozilla Developer post似乎支持这个理论。当通过在抛出错误的行之前添加此 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");

最佳答案

尝试在 IE 中调试并在 SharePoint 的默认 JavaScript 文件中放置断点。您确定默认 JavaScript 中的 Object.create 实例确实被命中了吗?

关于c# - JavaScript Object.create 和 IE8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14440592/

相关文章:

c# - 在每次调用中重用或创建 Analyzer、IndexSearcher、IndexWriter 哪个更好?

Javascript 使用鼠标坐标旋转图像

sharepoint - 在 XSLT 中设置变量值的替代方法?

java - Java 版 Sharepoint API

c# - 为什么IL2CPP运行无错无输出

c# - "A connection attempt failed because the connected party did not properly respond after a period of time"使用 HTTPClient 调用第 3 方 URL

c# - LINQ 返回分组为匿名类型的数据子集

javascript - 如何在字符串中添加动画

javascript - 滑动和淡出一个 div 元素

javascript - 通过 Rest 访问 Sharepoint 列表的 JQuery Json