Javascript 除非IE开发者控制台打开,否则不会加载我的CRM 2011 web资源

Javascript 除非IE开发者控制台打开,否则不会加载我的CRM 2011 web资源,javascript,jquery,dynamics-crm-2011,Javascript,Jquery,Dynamics Crm 2011,主要编辑1以下是对我的原始版本的描述,但我发现 Chrome和Firefox都正确加载了库。现在是9/10 这根本不起作用,即使反复刷新。然而,一旦我打开 开发人员控制台和重新加载一切工作正常 我已经阅读了有关该问题的内容,并遵循了概述的步骤。问题是jQuery在IE 9/10、Chrome或Firefox中的加载不可靠/不一致 我也无法100%可靠地重复这个问题。然而,通常发生的情况是,在我发布自定义web资源中的更改并重新加载表单后,我将在开发人员控制台中获得“jQuery未定义”。随后的重

主要编辑1以下是对我的原始版本的描述,但我发现 Chrome和Firefox都正确加载了库。现在是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);
}
//获取XML通用获取格式
函数genericFetch(实体、targetField、returnFields、searchSource)
{
returnFields=returnFields.split(“|”);
var searchValue=Xrm.Page.getAttribute(searchSource.getValue();
如果(搜索值)
{
searchValue=searchValue[0]['values'][1]['value'];
}
其他的
{
返回false;
}
函数onFetchError(xhr、状态、错误抛出)
{
var errormsg=$(xhr.responseXML.find('Message').text();
警报('CrmFetchKit-发生错误:'+errormsg);
}
var fetchXml=[''];
fetchXml.push(“”);
var len=returnFields.length;

对于(i=0;i),这可能是由于您的脚本在jQuery加载之前运行所致。例如,如果脚本未包装在:

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

使用
$(窗口)。在场景中加载(…);
可能会更成功

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

您可以使用以下方法解决此问题:

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

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

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

使用
$(窗口)。在场景中加载(…);
可能会更成功

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

您可以使用以下方法解决此问题:

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

这是由于脚本中的这行代码造成的:

console.log("results: " + JSON.stringify(results, null, 4));
在IE中,控制台对象在默认情况下是未定义的(这可能是因为MS CRM始终处于IE8文档模式,我不确定,但我在其他网站上看到过这个问题)

一旦打开“开发人员工具”窗口,console对象就被定义,代码开始工作

我在所有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_ };

这是由于脚本中的这行代码造成的:

console.log("results: " + JSON.stringify(results, null, 4));
在IE中,控制台对象在默认情况下是未定义的(这可能是因为MS CRM始终处于IE8文档模式,我不确定,但我在其他网站上看到过这个问题)

一旦打开“开发人员工具”窗口,console对象就被定义,代码开始工作

我在所有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_ };

我应该提到这一点(我似乎总是漏掉一些重要的细节),但实际上我删除了“document ready”子句,因为,出于我对JS无法理解的原因,CRM会抱怨genericFetch未定义。(实际上,我认为这是有意义的,因为CRM并不理解jQuery。)我应该提到这一点(我似乎总是漏掉一些重要的细节),但实际上我删除了“document ready”子句,因为,出于我对JS无法理解的原因,CRM会抱怨genericFetch未定义。(实际上,我认为这是有意义的,因为CRM并不理解jQuery。)我最近发现了此问题,但完全忘记更新我的帖子。抱歉,社区!也发生在SharePoint中,没有关于控制台未定义的错误或警告,但如果使用控制台语句,JSON将不起作用。我最近发现了此问题,但完全忘记更新我的帖子。抱歉,社区!也发生在SharePoint中,没有错误或警告关于控制台未定义的警告,但如果使用console语句,JSON将不起作用