javascript - 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 请求,但我正在寻找支持解决方案将毫无问题地升级并跨实例工作。这些是我想到的选项,我正在寻找关于哪个是最好的建议以及关于该选项的任何其他指导。我考虑了以下几点:
等待 ClientGlobalContext 可用,然后测试 jQuery,如果它不存在,则使用 document.write 包含它(某些版本不会出现,他们可能随时停止包含它),一旦 jQuery 可用,加载剑道并继续我的页面。同样,我无法更改 Microsoft 页面,并且由于那里有异步调用,这可能会给我留下一个计时器循环——我看不出这有多难看,但我可能会遗漏一些东西,丑陋与否,它可能是最好的选择。
说服 Microsoft 在重新加载之前检查 jQuery,或者提供不带 jQuery 的备用支持文件。由于我还没有看到其他人表达过这种沮丧,我认为这不太可能。目前在 Dynamics 365 论坛上没有想法,这是 Telerik 的建议,但这是一个合理的期望吗?
- 远离基于 jQuery 的 UI 库,因为我永远不会在 Dynamics 365 中控制整个页面。非常痛苦,因为我知道并喜欢当前的库,并且 jQuery 版本具有我使用的功能,但在 Angular 版本中还没有(Kendo Angular版本将是最简单的迁移,即使我必须学习角度)。我知道这是主观的而不是技术性的,所以如果它使问题变得更好,我可以删除这个选项,但它是一个选项,并且在项目中更难。
- 我没有想到的另一个解决方案,请记住 Dynamics Web 资源完全在客户端运行。如果有帮助,我正在用 TypeScript 编写并使用 npm 模块和 Webpack
解决方案
支持并推荐使用 jQuery (在某些情况下)。
我们建议您将 jQuery 与 HTML Web 资源一起使用
我不认为向微软提出它以获得一些帮助是不合理的。也就是说,它可能没有那么有用。
- 看来(据我所知)您基本上是在要求他们更改一些代码 - 当您(或者可能是 Telerik)可以更改代码以实现相同的事情时。
- 即使您确实设法说服他们做出改变,它也可能不会在很长一段时间内(例如几个月)出现在产品中。
在您自己的代码中实施修复可能会更快并节省您的时间。
您可能要考虑的解决方案(在上面的文章中提到)是使用 jQuery.noConflict
. Scott Durow在这里提出了一个类似问题的解决方案。
为你的 jQuery 库决定一个自定义的“命名空间”。我正在使用'xrmjQuery'</p>
在 jquery.js 脚本的末尾添加以下行:
/* jQuery script goes here */ window.xrmjQuery = jQuery.noConflict(true);
在您的 jquery_ui.js 脚本中(请注意,“-”已更改为下划线,因为 CRM 不允许它们出现在 Web 资源名称中),将整个文件包装在以下行中:
(function ($,jQuery) { /*! jQuery UI Goes here */ })(window.xrmjQuery,window.xrmjQuery);
在使用 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 的上下文,但不涉及这种情况的细节。我建议您实施的任何编码解决方案都可能毫无问题地升级。也就是说,微软建议在升级生产之前进行测试和验证。
一旦您的沙盒实例更新...测试您的解决方案和自定义的更新。
推荐阅读
- java - fragmentTransaction.replace().commit() 调用父Activity的onCreate
- node.js - linting 速记反应片段 <> (eslint/babel) 时出现意外标记
- reactjs - 如何在 Firestore 中更新对象内的嵌套数组
- react-native - 在本机反应中处理 RenderItem
- postgresql - PG DDL 事件触发器无法正常工作
- xml - xslt 1.0 对 3 个元素问题进行分组
- java - ContentCachingRequestWrapper 仅捕获带有 Content-Type:application/x-www-form-urlencoded 的 POST 请求
- javascript - 如何让 Quill 链接编辑器出现在 Quill 工具栏的顶部?
- wordpress - 如何搜索所有 WooCommerce 产品/类别...?
- java - java中使用indexOf的这条特定行是什么意思?