سؤال

لدي نوع حقل مخصص لـ SharePoint 2010/2007، ولكن بعد الترحيل إلى SharePoint 2013، واجهت مشكلة.
إليك ما قمت بتعريفه لـ "RenderPattern" في fldtypes_myfield.xml

<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.
في عام 2013، ضمن تجربة المستخدم 2013، عندما أعرض القائمة التي تحتوي على الحقل الخاص بي، يظهر الخطأ:

myfun is not defined  

لذا، السبب واضح، لم تتم إضافة myjs.js إلى الصفحة.(رابط js صحيح، انسخ الرابط إلى شريط العناوين ويمكن للمتصفح عرضه)
إذن سؤالي هو: لماذا لم يتم تسجيل myjs.js؟
أيه أفكار؟شكرا لك مقدما.

تحديث:
لا يعمل في صفحة "ListView"، ولكنه يعمل في صفحة "DisplayForm".تم ضبط "CAMLRendering" على "صحيح".ضمن صفحة "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 = النتيجة"، لأنه إذا تم إدراج بعض محتويات السلسلة في عنصر واحد كـ InternalHTML وكان المحتوى يحتوي على كود JavaScript، فلن يتم تنفيذ كود js.ولهذا السبب لا تتم إضافة "myjs.js" إلى الصفحة! أعتقد أن هذا أحد الاختلافات الكبيرة في عرض قائمة العرض في عامي 2010 و2013، ففي عام 2010، يتم إخراج بيانات القائمة html إلى الصفحة مباشرةً، بينما يتم إدراجها في الصفحة ديناميكيًا في عام 2013.

حل:
في الواقع، لا يزال هناك مكان واحد يحتوي على كود js ويمكنه تنفيذ الكود.إنه "onload" في img.فلماذا لا نسجل ملف 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