新社区网站

通常情况下,你会在正确的位置,但我们最近推出了一个全新的社区网站…为了社区,靠社区。

耶……带我去社区!

社区博客是社区成员的个人观点,绝不是DNN公司或DNN平台的官方立场。这是一个表达个人对DNNPlatform、社区及其生态系统的想法的地方。你有有用的信息,你想分享与DNN社区的特色文章或博客?如有,请联系

社区博客的使用由我们的社区博客指南-请在评论或张贴前阅读。


jQuery & jQuery UI在DNN 6.1.0和6.1.1

11月 18

在DNN 6.1中,在使用JavaScript方面有一些令人兴奋的变化,为开发人员提供了更大的灵活性,为每个人提供了更快的站点。更重要的是,现在已经为DotNetNuke在未来版本中构建更好的“客户端故事”打下了基础。

然而,在对框架进行如此重大的更改时,道路上有一些颠簸,我想确保每个人都意识到这些变化,并在评论中提供讨论的机会。

首先,让我们从jQuery的历史和jQuery UI在DNN中的使用开始,然后我们将讨论我们现在的情况。请耐心听我讲一段详细的历史旅程。

DotNetNuke 5

DotNetNuke 5.0引入了一个新的API方法,允许注册jQuery。从那时起,这就成为了在核心模块和第三方模块中注册jQuery的标准方式。

然而,一些模块开发人员,想要仍然支持旧版本的DotNetNuke(例如4.x),绕过公共API,检查内部标志(HttpContext.Current.Items("jquery_registered")),表示jQuery是否已注册。这不是/不是唯一的技术来支持向后兼容,尽管布鲁斯查普曼有一个他博客上的代码不错它支持相同的功能,而无需绕过公共API。

另一个需要注意的要点是,当DotNetNuke加载jQuery时,它总是加载在文档的中。这是因为jQuery是一个框架级的依赖项,需要在使用任何JavaScript之前加载,比如放置在皮肤、页面头、由第三方模块注册的脚本等。

DotNetNuke 6

唯一值得注意的是DotNetNuke 6的引入jQuery UI进入核心框架。此时,jQuery UI被放置在主体和表单之间。

DotNetNuke 6.1

DotNetNuke 6.1引入了新的客户端资源管理API。API允许使用注册提供程序对JS文件进行特定的放置。在6.1中,可用的选项是:

  1. PageHeaderProvider(附加到头部)
  2. DnnBodyProvider(表单顶部)
  3. DnnFormBottomProvider(表单底部)

jQuery是唯一使用PageHeaderProvider的脚本,其余将使用DnnBodyProvider,只有一个(搜索相关的脚本)将使用DnnFormBottomProvider。这样做是为了尽可能地复制之前的秩序。

同样值得注意的是,在DotnetNuke 6.1.0中,利用HttpContext键来查找jQuery是否已经加载的功能被移除,因为我们的jQuery注册系统的内部更改为使用新的客户端资源管理API,我们不再需要使用这个HttpContext键来跟踪。不幸的副作用是,现在那些使用这种技术的模块将再次加载jQuery。有时这会引起问题,有时不会。这完全取决于在第一次注册和第二次注册之间是否扩展了jQuery。稍后再详细介绍。

DotNetNuke但是

这是DotNetNuke 6.1.1中修复的6.1.0版本的两个特定问题。第一个问题是DotNetNuke Page的页眉和Styles皮肤对象的内容在页眉中没有按正确的顺序放置。当使用这两种技术中的一种时,这会导致排序问题。

解决这个问题的方法是创建一个新的注册提供程序“DnnPageHeaderProvider”,并使用它来代替“常规的”PageHeaderProvider,两者之间的区别很小但很重要:DotNetNuke版本将内容插入到特定的位置,而另一个则动态地将其内容追加到头部的末尾。使用DotNetNuke版本可以确保以预期的顺序加载内容。

第二个是jQuery UI在文档中的加载“太低”。如果有人正在编写依赖jQuery的代码,那么他们就有可能在加载jQuery之前注册他们的代码。这个决定是将jQuery UI移到头部-以与jQuery相同的方式对待它。这将改善那些想要利用jQuery UI的人的整体情况,确保在实际使用任何代码之前加载jQuery UI。

现状

在DotNetNuke 6.1或6.1.1中,如果一个模块依赖于jQuery注册API的内部实现来避免多次加载jQuery,那么它就不能工作。jQuery被加载了两次。

如果第二个版本的jQuery是在jQuery UI之后加载的,在6.1.1中很可能是这样,那么jQuery UI将不可用。原因如下:

  1. jQuery由DotNetNuke框架加载。定义jQuery对象。
  2. jQuery UI由DotNetNuke框架加载。jQuery对象扩展了jQuery UI特定的功能。
  3. 再次加载jQuery,并重新定义jQuery对象。并且,实际上,jQuery UI被“清除”了。

这可能会导致管理按钮停止工作,因为它们依赖于jQuery UI的可拖动功能。另外,如果它依赖于jQuery UI,其他模块的功能也可能被破坏。

下一步/行动项目

这里的长期答案是模块开发人员需要直接使用公共API,或者使用像Bruce Chapman使用的方法来处理使用API而不依赖于特定版本的DNN。

从短期来看,如果您被困在无法更改模块的情况中,并且无法移动回DotNetNuke的以前版本,唯一可行的临时措施是在页面的某个地方再次加载jQuery UI。无论如何都应该避免这种情况,因为您不仅在页面上有两个jQuery副本,而且现在还有两个jQuery UI副本-但如果您绝对为了解决这个问题,我建议在页面上放置一个text/html模块,并在页眉或页脚放置一个jQuery UI脚本引用。以下是片段: