【发布时间】: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
- 用户的网站上没有 jQuery
- 我的 JS 脚本动态加载 jQuery 并等待脚本 完成加载
- 一切都好
用例 2
- 用户在他们的网站上确实有 jQuery,但没有 jQueryUI
- 我的 JS 脚本只动态加载 jQueryUI 并等待 完成加载的脚本
- 我的 JS 文件尝试调用 $.ajax 并失败 :(
用例 3
- 用户在他们的网站上确实有 jQuery,并且确实有 jQueryUI
- 我的 JS 脚本不需要加载任何东西,所以它不会
- 我的 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