Imagine an usecase where you can dynamically load a Javascript from the CRM webresources because it doesn’t need to be loaded on every single form load. Perhaps a polyfill to add missing browser functions or a Javascript library like jQuery. Here it is…
function loadJavascriptFromWebresource(strWebresourceName, async) { //sync or async (default) if (async == undefined) { var async = true; } //build a new webrequest to get the content of the webresource by its name var req = new XMLHttpRequest(); req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.0/webresourceset?" + "$select=content&$filter=name eq '" + strWebresourceName + "'", async); req.setRequestHeader("OData-Version", "4.0"); req.setRequestHeader("OData-MaxVersion", "4.0"); req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.onreadystatechange = function () { if (this.readyState === 4) { req.onreadystatechange = null; if (this.status === 200) { //get the result of the request var result = (JSON.parse(this.response)).value[0].content; //decode the base64 encoded result var script = atob(result); //make an indirect eval call to make it globally available window.eval(script); } else { Xrm.Utility.alertDialog(this.statusText); } } }; req.send(); }
My personal usecase was to add a promises polyfill to the Internet Explorer. So, if you combine this post, my post about “Internet Explorer and promises” and you have a promises polyfill in your CRM webresources, you can use promises and do only load the polyfill in case the browser doesn’t support it.