6

私は SharePoint 2013 のソフトウェア開発を行っています。これには、SharePoint のファイル プレビューアーのオーバーライドが含まれます (filepreview.debug.js は myfilepreview.debug.js になります)。ただし、IE8 で問題が発生しました。すべてが IE9 で問題なく動作します。

IE8 でスローされたエラーは、カスタム機能がアクティブ化されているサイト コレクション内でアクセスしたすべてのサイトでエラーを引き起こします:「オブジェクトはこのプロパティまたはメソッドをサポートしていません」

このエラーについて調査したところ、IE8 は単純に をサポートしていないようですObject.createこの Mozilla Developer の投稿は、この理論を支持しているようです。エラーをスローしていた行の前にこのポリフィルコードを追加することで問題が解決されたとき、私はこれを信じるようにもっと迫られました:

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

おそらくIE8ではサポートされていないObject.createの機能を模倣しているため、それが機能することは理にかなっていると思います。

ただし、SharePoint のファイル プレビューアー JavaScript は問題なく機能するため、これは混乱を招きました。彼らの JavaScriptObject.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 JavaScript (上記) と私たちのもの (この時点まで) の唯一の違いは、次の 2 行を最初から削除したことですが、それらを再度追加しても問題は解決しません。

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

私の質問は次のとおりです: Object.create が IE8 でサポートされていないというエラーが表示されるのはなぜですか?

編集:別のフォーラムのユーザーが、sod 経由でスクリプトを登録してみることを提案しました。これをコードに追加しても効果はありませんでした:

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

2 に答える 2

3

IEでデバッグしてみて、SharePointのデフォルトのJavaScriptファイルにブレークポイントを設定します。デフォルトのJavaScriptのObject.createのインスタンスが実際にヒットしていることを確認しますか?

于 2013-01-21T21:48:33.853 に答える
3

彼らはObject.create適切な引数で使用していません。

彼らはObject.create({name:value})それが必要なときに使用しますObject.create({name:{value:value}})

したがって、彼らはおそらく独自のコードを定義しObject.create、コードはあなたのコードの後に​​使用されるため、コードが実行されたときにすでにObject.createセットがあり、おそらくあなたと同じように存在をテストし、実際にはあなたのものであるときにそこにあるのは彼らのバージョンであると想定します.

Object.createそのため、コード内の の定義を確認し、スクリプトが実行される順序を確認してください。

于 2013-01-26T17:45:45.507 に答える