Pregunta

Tengo un tipo de campo personalizado para SharePoint 2010/2007, pero después de migrar a SharePoint 2013, conocí un problema.
Aquí está lo que definí para "renderpattern" en fldrtypes_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 () se define en Myjs.js, por lo que cuando se carga PIC.PNG, ejecutará la función. Funciona bien en la experiencia del usuario de 2010/2007 y 2010 en SharePoint 2013.
En 2013, bajo la experiencia del usuario de 2013, cuando veo la lista que contiene MyField, lanza el error:

myfun is not defined  

Entonces, la razón es obvia, Myjs.js no se agrega a la página. (El enlace JS es correcto, copiar enlace a la barra de direcciones y el navegador puede mostrarlo)
Entonces, mi pregunta es: ¿Por qué está registrada myjs.js?
¿Algunas ideas? Gracias por adelantado.

Actualización:
No funciona en la página "ListView", pero funciona en la página "DisplayForm". "CamlRendering" se establece en verdadero. En la página "ListView", si consulta el campo con la herramienta del desarrollador web, el marcado HTML INTERETE está:

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

¿FarePoint 2013 prohíbe que se cargue la JS?

¿Fue útil?

Solución

Después de depurar, encontré que hay una variable llamada "wpq2listdata" que almacena el contenido de datos de la lista, su formato es:

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

}

Preste atención a "Myfield", tiene el contenido que debe ser representado.
En la página, "wpq2listdata" se usa en un solo lugar:

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

Luego, "CTX" se pasará a la función "RenderSlistView", que es responsable de hacer la vista de lista. Esta función se define en "ClientTemplates.js". Si se sumerge en él, descubrirá que llamará a otra función llamada "spclientrenderer.render", en esta función, generará todo el contenido HTML para los datos de la lista e insértelo en un TD (tal vez un DIV) como 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   
    }
}  

Preste atención a "node.innerhtml= resultado", porque si se inserta algunos contenidos de cadena en un elemento como inerhtml y el contenido contiene el código Javascript, el código JS no se ejecutará. ¡Y es por eso que "myjs.js" no se agrega a la página! Creo que esta es una de las grandes diferencias en la vista de la lista de renderización en 2010 y 2013, en 2010, en 2010, la lista de datos HTML se emite directamente, mientras que se inserta para que se inserta dinámicamente en 2013.

Solución:
En realidad, todavía hay un lugar que contiene el código JS y puede ejecutar el código. Es "Onload" en IMG. Entonces, ¿por qué no registramos nuestro archivo JS aquí? Y después de que Myjs.js está cargado, ¡deje que llame a 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);  

y para un mejor rendimiento, no tenemos que registrar myjs.js para cada fila, deberíamos verificar si existe primero.

Licenciado bajo: CC-BY-SA con atribución
scroll top