0

主要编辑 1下面是我最初的问题的描述,但我发现 Chrome 和 Firefox 都正确加载了库。即使反复刷新,IE 9/10 也根本无法工作。但是,一旦我打开开发者控制台并重新加载,一切正常。

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

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

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

  • 我正在使用依赖于 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);
}
4

2 回答 2

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_ };
于 2013-02-08T20:20:37.793 回答
2

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

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

或者

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

$(window).load(...);在您的场景中,您可能会取得更大的成功。

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

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

(function( $ ) {
    // Put code using jQuery via '$' here...
}(jQuery));
于 2013-01-30T23:52:00.917 回答