【问题标题】:How to properly dynamically include jQuery and jQueryUI on many pages如何在许多页面上正确地动态包含 jQuery 和 jQueryUI
【发布时间】:2013-10-04 20:10:12
【问题描述】:

我正在构建一个可以包含在许多不同网站上的小部件。这个小部件将需要使用 jQuery。我的客户将通过一个标签安装我的小部件,该标签将包含在他们的 </body> 标签之前(就像 Google Analytics 的工作原理一样)

对于如何处理每个人的网站环境不同的问题,我有点茫然。

目前我的解决方案是在我的 JS 代码中动态加载 jQuery 和 jQueryUI,它们将包含在 </body> 标记之前。但是,如果他们已经在他们的网站上加载了 jQuery,这会导致问题。

我搜索了一个解决方案来检测他们是否已经通过以下方式包含了 jQuery:

if (typeof jQuery == 'undefined') { 
  // include jQuery 
}
if (typeof jQuery.ui == 'undefined')
{
  // include jQueryUI
}

但是,当他们已经加载了 jQuery 时,这会导致问题......如果他们的网站上已经包含 jQuery,我的 JS 小部件无法访问已经从客户网站加载的 jQuery 库,因为我收到一条错误消息,提示它无法识别“$”。

我确定这个问题之前已经解决了,但我似乎找不到答案。

更新

为了澄清一点......我上面包含的代码是好的,它不会引起问题。以下是用例:

用例 1

  1. 用户的网站上没有 jQuery
  2. 我的 JS 脚本动态加载 jQuery 并等待脚本 完成加载
  3. 一切都好

用例 2

  1. 用户在他们的网站上确实有 jQuery,但没有 jQueryUI
  2. 我的 JS 脚本只动态加载 jQueryUI 并等待 完成加载的脚本
  3. 我的 JS 文件尝试调用 $.ajax 并失败 :(

用例 3

  1. 用户在他们的网站上确实有 jQuery,并且确实有 jQueryUI
  2. 我的 JS 脚本不需要加载任何东西,所以它不会
  3. 我的 JS 文件尝试调用 $.ajax 并失败 :(

所以问题是……

为什么我的 JS 文件在加载 jQuery 本身时只能访问 $.ajax(和其他 jQuery 函数)?

【问题讨论】:

  • 你用 jQuery 做什么?也许最好改为调整您的代码以不依赖 jQuery,而不是包含您并不真正需要的 xkb 额外代码。
  • 我同意@KevinB。如果 jQuery 和 jQuery UI 是您的小部件的硬依赖项,那么您需要将其传达给您的用户,否则您需要在没有它的情况下工作。您的小部件在这方面与 Google Analytics(分析)非常不同。这不是一个不合理的要求(想想任何 jQuery 插件)。
  • 我支持至少你的小部件不应该依赖于 jQuery UI 的想法。如果你不能没有它,请确保为 jQuery UI 定义一个 css 范围以避免冲突。如果他们没有 jQuery,您可能需要定义一个命名空间以避免与其他库发生冲突。我个人认为 jQuery 是一个依赖项,并且使用了 jQuery UI 以外的东西。
  • 我在整个小部件中大量使用 jQuery……但我相信我只在 jQueryUI 函数(可拖动)上使用,所以放弃这种依赖是合理的。但是,这仍然不能解决我遇到的问题......即使我不担心加载 jQueryUI,如果我没有在我的 JS 小部件中强制加载它,我的小部件仍然会遇到访问 jQuery 的问题。这是我得到的错误Uncaught TypeError: Cannot call method 'ajax' of undefined
  • 你怎么知道宿主页面的jQuery版本与你的代码兼容?至少您需要检查 jQuery 版本以及是否存在 jQuery,并使用您支持的所有版本测试您的代码。然后如果发现一个不兼容的 jQuery,加载你自己的并使用 jQuery.noConflict() 给它一个私有名称。

标签: jquery widget installation


【解决方案1】:

尝试改用这个:

if(typeof(jQuery) === undefined){
    //load jquery
}
else{
    //jquery already there

    if(typeof(jQuery.ui) === undefined){
        //load jquery ui
    }
}

更新

【讨论】:

  • 不需要检查 jquery.ui,除非包含 jquery
  • 我明白你在说什么,但是如果我的 JS 小部件没有加载 jQuery 本身,这将如何解决无法访问 jQuery 的问题(因为访问 jQuery 函数似乎有问题如果我自己不强制加载 jQuery)
【解决方案2】:

好的,事实证明代码和我所拥有的一切都运行良好......只是我安装小部件的一些网站必须使用 $“命名空间”来处理 jQuery 以外的其他东西。

所以我必须检查我的客户端 JS 文件并将所有出现的“$”替换为“jQuery”。

示例

已更改:$.ajax({});
至:jQuery.ajax({});

已更改:$("#textbox").change(function () {});
至:jQuery("#textbox").change(function () {});

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多