除非IE开发者控制台处于打开状态,否则我的CRM 2011 Web资源将无法加载

时间:2013-01-30 23:18:53

标签: javascript jquery dynamics-crm-2011

  

MAJOR EDIT 1 以下是我原始问题的描述,但我发现了   Chrome和Firefox都正确加载库。它是 IE 9/10   即使重复刷新, 根本不会工作。但是,一旦我打开   开发人员控制台并重新加载一切正常。

我已阅读this post有关此问题的信息,并按照概述的步骤操作。问题是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);
}

2 个答案:

答案 0 :(得分:3)

这是由于脚本中的这行代码所致:

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_ };

答案 1 :(得分:2)

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

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

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

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

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

您可以使用以下内容解决此问题:

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