SharePoint 2013에서 사용자 정의 필드 유형에 대해 JS를 등록하십시오

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/54618

  •  10-12-2019
  •  | 
  •  

문제

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가로드되면 함수가 실행됩니다. 2010/2007 및 2010 년 SharePoint 2013에서 2010 년도 사용자 환경에서 잘 작동합니다.
2013 년, 2013 년 사용자 경험에서 MyField가 포함 된 목록을 볼 때 오류가 발생합니다.

myfun is not defined  
.

이유가 분명합니다. myjs.js가 페이지에 추가되지 않습니다. (JS 링크가 올바른지, 주소 표시 줄에 대한 링크와 브라우저가 표시 할 수 있습니다)
그래서, 내 질문은 이유는 왜 myjs.js가 등록되지 않았습니까?
어떤 아이디어가 있습니까? 미리 감사드립니다.

업데이트 :
"ListView"페이지에서 작동하지 않지만 "DisplayForm"페이지에서 작동합니다. "Camlrendering"은 true로 설정됩니다. "ListView"페이지에서 웹 개발자 도구가있는 필드를 확인하면 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가로드 할 것을 금지합니까?

도움이 되었습니까?

해결책

디버깅 후에는 목록 데이터 콘텐츠를 저장하는 "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 (Div)로 삽입합니다. 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= 결과 "에주의하십시오. 왜냐하면 일부 문자열 내용이 하나의 요소에 innerhtml로 하나의 요소에 삽입되고 JavaScript 코드가 들어 있으면 JS 코드가 실행되지 않습니다. 그리고 이것이 페이지에 "myjs.js"가 추가되지 않는 이유입니다! 2010 년과 2013 년에 렌더링 목록보기에서 큰 차이점 중 하나라고 생각합니다. 2010 년 목록 데이터 HTML은 2013 년에 동적으로 페이지에 삽입 된 상태에서 데이터 HTML을 직접 출력합니다.

솔루션 :
실제로 JS 코드가 포함 된 한 곳이 있으며 코드를 실행할 수 있습니다. 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