2

簡単に言えば:

しばらくの間、JQuery/JQueryUI ベースのシステムに関してエラーがログに記録されていました。核となるのは、かなり基本的なクリック リンク -> JQuery AJAX GET -> Open JQueryUI モーダル パターンです。

私たちが得たエラーは単純に見えました - 「オブジェクトはプロパティまたはメソッド 'ダイアログ' をサポートしていません」 - JQueryUI にエラーがあると思わせました。ブラウザーの非互換性、JQuery 側の不適切なコード、私たちの側の不適切なコード、怒っているコードの神様などを排除するために多くの時間を費やした後、私たちは幸運な休憩を取りました。オフィスのマシンの 1 つで 100% 再現。

アドウェア、具体的には [の古いバージョンの] easyinline - http://www.easyinline.comで埋め尽くされていたことが判明しました。ユーザーがリンクをクリックすると、Google の CDN から JQuery をリロードするなど、JavaScript ファイルのカスケードが読み込まれます。

ほとんどのリンクでは、これは実際には問題ではありません。いずれにせよページから移動し、すべてがリロードされます。しかし、私たちのモーダルでは、リクエストが送信された時点ですべてのモーダル リンクが JQuery にスタンプされることを意味し、その結果、JQueryUI やその他のプラグインが欠落している「新しい」$ を利用しようとするレスポンスが発生しました。

最初は、「私たちの」JQuery 用に別のグローバル var ($$ など) を作成し、それを $ だけでなくコードで明示的に使用することを考えました。これに関する問題は、$ に依存する他のいくつかのサードパーティ ツールを使用していたことと、アドウェアをロードした $ が別の (古い) バージョンであることです。したがって、$ を正しく保存することが重要です。

何か案は?私は 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.
ページが機能していません。Jquery ドキュメントの準備完了イベントで、プラグイン CDN へのリンク (をscript tag使用して) を挿入してみてください。document.writeこれにより、すべての jquery が既に読み込まれているときにプラグイン コードが最後に読み込まれることが保証されます (これは好ましくありません)。

于 2012-11-20T17:26:17.263 に答える