質問

SharePoint 2010/2007用のカスタムフィールドタイプを持っていますが、SharePoint 2013に移行した後、問題を満たしました。
これがfldtypes_myfield.xml の "RenderPattern"に対して定義したものです。

<RenderPattern Name="DisplayPattern">
<HTML><![CDATA[<script type="text/javascript" src="/_layouts/myfield/myjs.js"></script>]]></HTML>
<HTML><![CDATA[<img src="/_layouts/images/myfield/pic.png" onload="myfun()">]]></HTML>
</RenderPattern>
.

myfun()はmyjs.jsで定義されているので、pic.pngがロードされていると、機能が実行されます。それはSharePoint 2013で2010/2007と2010年のユーザーエクスペリエンスでうまく機能します。
2013年、2013年のユーザーエクスペリエンスの下、MyFieldを含むリストを表示すると、エラーがスローされます。

myfun is not defined  
.

だから、その理由は明らかである、myjs.jsはページに追加されません。 (JSリンクは正しいです、アドレスバーへのコピーリンクとブラウザに表示できます)
だから、私の質問は:なぜmyjs.jsが登録されていないのですか?
何か案は?前もって感謝します。

更新:
「ListView」ページでは機能しませんが、「DisplayForm」ページで機能します。 "CamlRendering"はtrueに設定されています。 「ListView」ページで、Web開発者ツールでフィールドをチェックすると、ISの中のHTMLマークアップが次のとおりです。

<SCRIPT type=text/javascript src="/_layouts/myfield/myjs.js"></SCRIPT>  
<DIV><IMG src="/_layouts/images/myfield/pic.png" onload="myfun()"></DIV>  
.

SharePoint 2013は、JSをロードするためのJSを禁止しますか?

役に立ちましたか?

解決

デバッグ後、リストデータの内容を格納する「WPQ2ListData」という変数があることがわかりました。

var WPQ2ListData = {
"Row": [{
    "ID": "1",
    "PermMask": "0x7fffffffffffffff",
    "FSObjType": "0",
    "Title": "A",
    "FileLeafRef": "1_.000",
    "Created_x0020_Date.ifnew": "1",
    "FileRef": "\u002ftest\u002fLists\u002fRatingList\u002f1_.000",
    "File_x0020_Type": "",
    "File_x0020_Type.mapapp": "",
    "HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon": "",
    "HTML_x0020_File_x0020_Type.File_x0020_Type.mapico": "icgen.gif",
    "ContentTypeId": "0x01008AD43674D321D3428ACAFC1C3BD2971E",
    "MyField": "<script type=\"text/javascript\" src=\"/_layouts/myfield/myjs.js\"></script><img src=\"/_layouts/images/myfield/pic.png\" onload=\"myfun()\">"
}],
"FirstRow": 1,
"LastRow": 1,
"FilterLink": "?",
"ForceNoHierarchy": "1",
"HierarchyHasIndention": ""
.

}

「MyField」に注意を払う、それはレンダリングされるべき内容を持っています。
ページでは、「WPQ2ListData」が一箇所で使用されています。

ctx = new ContextInfo();  
//other assignments
ctx.ListData = WPQ2ListData;
.

その後、 "CTX"は関数 "RenderListView"に渡され、リストビューのレンダリングを担当します。この関数は "clienttemplates.js"で定義されています。あなたがそれにダイビングするならば、この関数で "spclientRenderer.render"という別の関数を呼び出すことになるでしょう、この関数でリストデータのHTMLコンテンツ全体を生成し、それをtd(mool)に挿入します(mool)。 innerhtml。

var result = SPClientRenderer.RenderCore(renderCtx);  
if (result != null && result != '') {
    if (node.tagName == "DIV" || node.tagName == "TD") {  
        if (renderCtx.fHidden)  
            if (renderCtx.fHidden)  
        node.innerHTML = result;
    }else{
        //create div element, and insert result as innerHTML   
    }
}  
.

"node.innerhtml= result"に注意してください。そして、これが "myjs.js"がページに追加されていない理由です! これは、2010年と2013年のレンダリングリストビューの大きな違いの1つであると思います。2010年にリストデータHTMLは直接ページに出力され、2013年に動的にページに挿入されます。

解決策:
実際には、JSコードを含む1つの場所があり、コードを実行できます。 IMGの「onload」です。だから、私たちはここにJSファイルを登録しないのですか?そしてMyjs.jsがロードされた後、MyFun()を呼び出しましょう。

var head = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = '/_layouts/myfield/myjs.js';
script.onload = script.onreadystatechange = function() {
    myfun();
};
head.appendChild(script);  
.

そしてより良い性能のために、それぞれの行にmyjs.jsを登録する必要はありません、私たちはそれが最初に存在するかどうかをチェックする必要があります。

ライセンス: CC-BY-SA帰属
所属していません sharepoint.stackexchange
scroll top