除非 IE 开发人员控制台处于打开状态,否则我的 CRM 2011 Web 资源将不会加载

My CRM 2011 web resources will not load unless IE developer console is open

本文关键字:Web 2011 CRM 我的 资源 加载 开发 IE 控制台 状态 于打开      更新时间:2023-09-26

主要编辑 1 以下是我原始问题的描述,但我发现 Chrome和Firefox都正确加载了库。这是IE 9/10 即使反复刷新,这也根本不起作用。但是,一旦我打开 开发人员控制台并重新加载一切正常。

我已经阅读了这篇关于这个问题的文章,并按照概述的步骤进行操作。问题是jQuery在IE 9/10,Chrome或Firefox中无法可靠/一致地加载。

我也无法以 100% 的可靠性重复该问题。但是,通常发生的情况是,在自定义 Web 资源中发布更改并重新加载表单后,我将在开发人员控制台中得到"jQuery is undefined"。随后的重新加载不会显示错误,如果我在重新加载之前清除缓存,行为似乎没有区别。

以下是我的实现的一些细节:

  • 我正在使用依赖于jQuery的CrmFetchKit库。
  • 为了完成这项工作,我将这两个库合并为一个 Web 资源。这背后的想法是,错误总是来自 CrmFetchKit,它告诉我该文件在正确包含方面没有问题。
  • 我的代码在下面。
  • 我的函数"genericFetch()"在我的实验表单上的查找属性的 onChange 事件处理程序中设置。
  • 当jQuery可用时,一切都按预期工作(即使js超级丑陋)。

如果需要,我很乐意提供更多信息和/或屏幕截图。

// Fetch XML generic fetch format
function genericFetch(entity, targetField, returnFields, searchSource)
{
    returnFields = returnFields.split('|');
    var searchValue  = Xrm.Page.getAttribute(searchSource).getValue();
    if(searchValue)
    {
        searchValue = searchValue[0]['values'][1]['value'];
    }
    else
    {
        return false;
    }
    function onFetchError(xhr, status, errorThrown)
    {
        var errormsg = $(xhr.responseXML).find('Message').text();
        alert('CrmFetchKit-Error occured: ' +  errormsg);
    }
    var fetchXml = ['<fetch version="1.0" output-format="xml-platform" mapping="logical">'];
    fetchXml.push('<entity name="' + entity + '">');
    var len = returnFields.length;
    for(i=0; i<len; i++)
    {
        fetchXml.push('<attribute name="' + returnFields[i] + '" />');
    }
    fetchXml.push('<filter type="and">');
    fetchXml.push('<condition attribute="' + returnFields[0] + '" operator="eq" value="' + searchValue + '" />');
    fetchXml.push('</filter>');
    fetchXml.push('</entity>');
    fetchXml.push('</fetch>');
    fetchXml = fetchXml.join('');
    CrmFetchKit.Fetch(fetchXml).then(function (results) {
        /* success handler */
        console.log("results: " + JSON.stringify(results, null, 4));
        Xrm.Page.getAttribute(targetField).setValue(results[0]['attributes']['productnumber']['value']);
    }, onFetchError);
}
这是

由于脚本中的以下代码行:

console.log("results: " + JSON.stringify(results, null, 4));
在IE

中,控制台对象默认未定义(这可能是由于MS CRM始终处于IE8文档模式,我不确定,但我在其他站点上看到了这个问题)。

打开开发人员工具窗口后,控制台对象将立即定义,代码开始工作。

我在MS CRM的所有脚本中的解决方案是:如果未定义,则为控制台对象定义一个空覆盖,例如

var _f_ = function () { };
window.console = window.console || { log: _f_, error: _f_, info: _f_, debug: _f_, warn: _f_, trace: _f_, dir: _f_, dirxml: _f_, group: _f_, groupEnd: _f_, time: _f_, timeEnd: _f_, assert: _f_, profile: _f_ };

这可能是由于您的脚本在 jQuery 加载之前运行。 即,如果脚本未包装在:

$(document).ready( function() {
    // Your code...
});

$(window).load( function() {
    // Your code...
});

在你的方案中,$(window).load(...);可能会取得更大的成功。

这似乎是最有可能的,因为它是一个间歇性问题。然而;我还建议查看您的代码是否与另一个脚本冲突,例如,如果与jQuery冲突的脚本首先加载,那么它可能会阻止jQuery正常工作。

你可以通过使用这样的东西来解决这个问题:

(function( $ ) {
    // Put code using jQuery via '$' here...
}(jQuery));