2

长话短说:

一段时间以来,我们已经记录了有关基于 JQuery/JQueryUI 的系统的错误。在它的核心,我们正在做一个非常基本的点击链接 -> JQuery AJAX GET -> 打开 JQueryUI 模式模式。

我们得到的错误看起来很简单——“对象不支持属性或方法'对话框'”——导致我们相信 JQueryUI 存在错误。在花费大量时间排除浏览器不兼容、JQuery 端的错误代码、我们端的错误代码、愤怒的代码之神之后……我们幸运地休息了。在办公室的一台机器上进行 100% 的复制。

原来这东西充斥着广告软件——特别是easyinline的[旧版本]——http: //www.easyinline.com。当用户单击任何链接时,将加载级联的 javascript 文件,包括从 Google 的 CDN 重新加载 JQuery。

对于大多数链接来说,这并不是一个真正的问题——它们无论如何都会让你离开页面并且一切都会重新加载。但是对于我们的模态,这意味着每个模态链接都会在发送请求时覆盖我们的 JQuery,从而导致响应尝试使用现在缺少 JQueryUI 和任何其他插件的“新”$。

最初,我们考虑为“我们的”JQuery 创建另一个全局变量($$ 或其他东西),并在我们的代码中显式使用它,而不仅仅是 $。问题在于我们使用了其他一些依赖 $ 的 3rd 方工具,而加载广告软件的 $ 是不同的(旧)版本。因此,正确保存 $ 很重要。

有任何想法吗?我知道 JQuery 的 noConflict() 方法,但粗略一瞥后认为它不符合要求。

4

2 回答 2

1

最终,我们决定在收到任何 ajax 响应时重新建立我们的 JQuery 完整性(即在执行打开模式代码之前)。我们所有的 ajax 东西都包装在我们自己的处理程序中,所以这很容易全面注入。

基本上;

我们已经“保存”了原始的 JQuery - 由于我们的处理程序,我们已经将它放在了范围内,但它可以在加载后轻松放入单独的全局(如 $$)中。在我们的 ajax 响应处理程序中,我们有一个相当简单的检查;

if (window.$ !== $$) {
    window.$ = window.jquery = window.jQuery = $$;
}

这会将全局 jquery 重置为应有的状态。

于 2012-11-26T12:17:13.600 回答
0

好吧,这只是一种解决方法,而不是一个完整的解决方案。
您可以在此处尝试多种操作
1. 如果您可以控制广告软件加载的内容,那么只需if(!$)在他们尝试加载 jquery 的地方放入类似的内容
2. 尝试在页面末尾加载您的插件
3.即使结束页面不工作。script tag尝试在 Jquery 文档就绪事件中将链接(a using )注入document.write到插件 CDN。这将确保在所有 jquery 都已加载(不是首选)时最后加载插件代码。

于 2012-11-20T17:26:17.263 回答