首页 > 解决方案 > Dynamics 365 中的 Web 资源 - 由 ClientGlobalContext.js.aspx 加载的 jQuery 破坏的 Kendo UI

问题描述

多年来,我一直在 Dynamics CRM 的 Web 资源中使用 Kendo UI。我的组件需要使用 ClientGlobalContext.js.aspx。在 Dynamics 365 online 的 9.0.2.54 版本中,我发现较新版本的 ClientGlobalContext.js.aspx 会加载自己的 jQuery 版本,而不会检查是否已经存在。它使用 document.write 语句来完成此操作,因此这个版本的 jQuery 总是在我的代码之后加载。我可以通过使用此调用生成的 JavaScript 并注释掉 jQuery 加载行来临时解决此问题,因为大多数实例/上下文特定信息来自作为此页面一部分的 xhr 请求,但我正在寻找支持解决方案将毫无问题地升级并跨实例工作。这些是我想到的选项,我正在寻找关于哪个是最好的建议以及关于该选项的任何其他指导。我考虑了以下几点:

标签: javascriptjquerykendo-uidynamics-crm

解决方案


支持并推荐使用 jQuery (在某些情况下)。

我们建议您将 jQuery 与 HTML Web 资源一起使用

我不认为向微软提出它以获得一些帮助是不合理的。也就是说,它可能没有那么有用。

  • 看来(据我所知)您基本上是在要求他们更改一些代码 - 当您(或者可能是 Telerik)可以更改代码以实现相同的事情时。
  • 即使您确实设法说服他们做出改变,它也可能不会在很长一段时间内(例如几个月)出现在产品中。

在您自己的代码中实施修复可能会更快并节省您的时间。

您可能要考虑的解决方案(在上面的文章中提到)是使用 jQuery.noConflict. Scott Durow在这里提出了一个类似问题的解决方案。

  1. 为你的 jQuery 库决定一个自定义的“命名空间”。我正在使用'xrmjQuery'</p>

  2. 在 jquery.js 脚本的末尾添加以下行:

    /* jQuery script goes here */
    window.xrmjQuery = jQuery.noConflict(true);
    
  3. 在您的 jquery_ui.js 脚本中(请注意,“-”已更改为下划线,因为 CRM 不允许它们出现在 Web 资源名称中),将整个文件包装在以下行中:

    (function ($,jQuery) {
      /*! jQuery UI Goes here */
    })(window.xrmjQuery,window.xrmjQuery);
    
  4. 在使用 jQuery 和 jQuery-UI 的 JavaScript Web 资源中,将代码包装在以下内容中:

    (function($){
    // Your Javascript goes here and can reference $ as usual
    // e.g. var someField = $('#fieldName');
    })(window.xrmjQuery);
    

这种技术称为 jQuery 的封装和命名空间。

关于可支持性和未来的升级。值得记住的是保持支持意味着什么。

...您可以假设(有合理的信心)您的实现将;

  • 功能正确。
  • Microsoft 支持将在他们不提供帮助时提供帮助。
  • 当升级发生时将继续工作(除非功能被弃用——这种情况会发生,但您通常会收到几年的通知)。

我在上面链接的第一篇文章和this构建了支持 jQuery 的上下文,但不涉及这种情况的细节。我建议您实施的任何编码解决方案都可能毫无问题地升级。也就是说,微软建议在升级生产之前进行测试和验证。

一旦您的沙盒实例更新...测试您的解决方案和自定义的更新。


推荐阅读