Question

J'ai un type de champ personnalisé pour SharePoint 2010/2007, mais après avoir migré vers SharePoint 2013, j'ai rencontré un problème.
Voici ce que j'ai défini pour "RenderPattern" dans 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 () est défini dans myJs.js, alors quand pic.png est chargé, il exécutera la fonction. Cela fonctionne bien en 2010/2007 et 2010 Expérience utilisateur à SharePoint 2013.
En 2013, en vertu de l'expérience utilisateur de 2013, lorsque je visite la liste contenant Myfield, elle jette l'erreur:

myfun is not defined  

Donc, la raison est évidente, myjs.js n'est pas ajoutée à la page. (Le lien JS est correct, Copier le lien vers la barre d'adresse et le navigateur peut l'afficher)
Donc, ma question est la suivante: pourquoi myjs.js n'est pas inscrit?

Des idées? Merci d'avance.

mise à jour:

Il ne fonctionne pas dans la page "ListView", mais cela fonctionne dans la page "DisplayForm". "Camlrendering" est défini sur true. Dans la page "ListView", si vous vérifiez le champ avec Web Developer Tool, le balisage HTML à l'intérieur de l'est:

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

SharePoint 2013 a-t-il interdit à la JS de charger?

Était-ce utile?

La solution

Après le débogage, j'ai trouvé une variable appelée "WPQ2ListData" qui stocke le contenu de la liste de données, son format est:

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": ""

}

Faites attention à «Myfield», il a le contenu qui devrait être rendu.
Dans la page, "WPQ2ListData" est utilisé à un endroit:

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

Alors "CTX" sera transmis à la fonction "RenderListView", qui est responsable de la vue de la liste. Cette fonction est définie dans "clientTemplates.js". Si vous plongez dedans, vous constaterez que cela appellera une autre fonction appelée «spclientRenderer.render», dans cette fonction générera tout le contenu HTML pour les données de la liste et l'insérera à un TD (peut-être une DIV) comme 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   
    }
}  

Faites attention à «nœud.innerhtml= Résultat», car Si un contenu de chaîne est inséré sur un élément d'innerhtml et le contenu contient du code JavaScript, le code JS ne sera pas exécuté. Et c'est pourquoi "myjs.js" n'est pas ajouté à la page! Je pense que c'est l'une des plus grandes différences sur la vision de la liste de rendu en 2010 et 2013, en 2010, la liste des données HTML est sortie directement sur la page, alors qu'elle est insérée à la page de manière dynamique en 2013.

solution:
En fait, il existe toujours un endroit contenant du code JS et peut exécuter le code. C'est "surcharge" dans img. Alors, pourquoi n'enregistrons pas notre fichier JS ici? Et après que MyJs.js est chargé, laissez-le appeler 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);  

Et pour une meilleure performance, nous n'avons pas à enregistrer MyJs.js pour chaque rangée, nous devrions vérifier s'il existe d'abord.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top