Escenario:
Necesitamos ejecutar cierto código Javascript pero queremos que se haga al final de la carga de la página, por ejemplo si vamos a rellenar un input que no sabemos en qué momento estará disponible.
Solución jQuery:
Por todos es sabido a estas alturas que el problema se resolvería fácilmente haciendo uso de jQuery controlando el momento en el que la página esté “lista (ready)”, es decir:
1: $(document).ready(function() {
2: // Código a ejecutar
3: // ...
4: });
Pero estamos hablando de SharePoint 2010 que usa bastante Javascript para realizar acciones de carga o de control de los campos atendiendo a su tipo. Por lo tanto, ¿podemos asegurar que la página esté “lista (ready)” y que todo esté terminado de cargar cuando se ejecute $(document).ready(…)? Pues… aunque cueste creerlo, la respuesta es que no. SharePoint sigue haciendo algo de carga en algunos casos y, aunque como norma general no deberíamos tener problemas, podemos encontrarnos alguna situación en la que no funciona como debería.
Solución _spBodyOnLoadFunctionNames:
SharePoint utiliza sus propias funciones de carga y, en este caso vamos a aprovechar la función que se ejecuta en la carga del body, _spBodyOnLoadFunctionNames que se conjuntará con el código que usemos en el caso anterior. Para ello, sólo tendremos que hacer algo muy sencillo como es encapsular dentro de una función el código que queremos ejecutar al finalizar la carga de la página e instanciarlo con _spBodyOnLoadFunctionNames que lo pondrá en una cola de carga de scripts y que se ejecutar al finalizar todos los procesos de SharePoint
1: _spBodyOnLoadFunctionNames.push("myCustomFunctionName");
2:
3: function myCustomFunctionName() {
4: // Código a ejecutar
5: // ...
6: }
Conclusión:
Es importante que intentemos hacer uso de las funciones que SharePoint nos provee y aprovechar así que la rueda ya está inventada, en vez de como casi siempre hacemos los amantes del desarrollo que es hacer nuestro propio código porque lo vemos más claro y, en ocasiones, incluso mejor. Un error que cometemos muy a menudo.