【问题标题】:Loading jQuery after AngularJS (instead of before)在 AngularJS 之后(而不是之前)加载 jQuery
【发布时间】:2015-03-02 20:20:59
【问题描述】:

为了让 angular.element 指向 jQuery 而不是 jQLite,需要在页面头部的 Angular 之前加载 jQuery。

但是,出于性能原因(尤其是在移动设备上),如果可以在加载 AngularJS 之后加载 jQuery,那就太好了。 jQuery 库比较大,所以让“首屏内容”依赖于 jQuery lite,让 jQuery 在 Angular 之后异步加载,会提高性能。

我认为如果 Angular 公开它的 bindJquery 函数和它的 JQLitePrototype 对象是可能的。

有人知道如何在不触及 Angular 核心的情况下做到这一点吗?

【问题讨论】:

  • 不需要jQuery,可以使用angular+native/javascript代码工作,jqLit​​e做事能力很强。
  • 是的,我同意(除了我错过了 'find' 中的类选择器这一事实),但我需要支持很多现有的 jQuery 代码。

标签: jquery angularjs performance mobile


【解决方案1】:

您可以在加载 jQuery 后手动扩展 JQLite 原型:

angular.extend(angular.element.prototype, jQuery.fn);

然而,由于这不是 Angular 和 jQuery 的设计用途,它可能会带来不必要的问题。但是,如果您的唯一目的是使用一些有用的 jQuery 方法扩展 angular.element,那应该没问题。

查看下面的演示,了解 jQuery 的方法如何在 angular.element 中可用,即使 jQuery 是在 Angular 之后加载的。

演示:http://plnkr.co/edit/fo70VtmgBCQDU9RWGGVF?p=preview

【讨论】:

  • 谢谢,好建议。但是,Angular 也添加了以下内容:extend(jQuery.fn, { scope: JQLitePrototype.scope, isolateScope: JQLitePrototype.isolateScope, controller: JQLitePrototype.controller, injector: JQLitePrototype.injector, hiddenData: JQLitePrototype.inheritedData });跨度>
  • 应该没问题。 JQLite 将包含scopecontroller 等所需的所有内容。以上代码所做的基本上是在原型中添加额外的方法,而不影响现有的 JQLite 原型。
  • 知道使用此解决方案可能会遇到什么样的问题吗?
  • 很难说。 DOM 方法应该没问题。我不确定,也许还有其他可能受到影响的东西。但是现在看不到了。
  • 当我应用这个解决方案时,我得到“angular.js:13920 TypeError: a.parent(...).inheritedData is not a function”。我该如何解决?
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 2017-10-14
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多