プロトタイプとjQueryの平和的な共存?
-
03-07-2019 - |
質問
JavaScriptについてはほとんど知りませんが、それにもかかわらず、WordPressブログで何かをまとめようとしています。それは機能していません、そして私はそれを解決する方法を知りません、そしてねえ、それはStackOverflowの目的ですよね?
まず、エラーメッセージは次のとおりです。
Error: element.dispatchEvent is not a function
Source File: http://.../wp-includes/js/prototype.js?ver=1.6
Line: 3936
ページの読み込み時に発生します。私のページ読み込みハンドラーはこうして登録されています:
Event.observe(window, 'load', show_dates_as_local_time);
他のプラグインを無効にするとエラーは消え、これにより(グーグルに加えて)プロトタイプとjQuery(他のプラグインの一部で使用される)の競合であると結論付けられました。
第二に、 wp_enqeue_script
次のように、JavaScriptからPrototypeライブラリに依存関係を追加します。
add_action( 'wp_print_scripts', 'depo_theme_add_javascript' );
function depo_theme_add_javascript() {
wp_enqueue_script('friendly_dates', 'javascript/friendly_dates.js', array('prototype'));
}
これで、jQuery noConflicts
メソッドを使用して解決されるjQueryとPrototypeの間に潜在的な競合があることも認識しています。私はいろいろな場所からそれを呼んでみましたが、良くありません。 a) noConflict
関数は $
変数にのみ関連しているため、これは問題ではないと考えません。ここでの問題、およびb)wordpressがそれを解決するために期待するだろう...
最後に、Venkmanデバッガーを使用して、エラーメッセージで参照されている element
は実際には HTMLDocument
であるが、 dispatchEvent コード>。標準のDOMメソッドであるため、これがどのように発生するかわかりませんか?
解決 4
すべての提案に感謝します。最終的には、ケントの説明が最も近いと思います。これは基本的に「プロトタイプが壊れています」に相当します。 (間違って要約している場合はごめんなさい:)
jQuery.noConflict
オプションに関しては-すでに質問でこれについて言及しました。このメソッドを実行すると 違いが生じますが、私はそれをほとんど制御できません。先ほど言ったように、いくつかの異なる場所(具体的にはページヘッダーとスクリプトファイル)で実行しようとしましたが、効果はありませんでした。ですから、私たち全員が望んでいるように、"単に noConflict
"を使用してください少なくとも追加情報がない限り、この質問に対する回答ではありません。
さらに、 jQuery.noConflict
は $
変数に関するものであり、エラーポイント周辺のコードはその変数を処理しませんまったく。もちろん、間接的に関連している可能性がありますが、追跡していません。
したがって、基本的に、PrototypeではなくjQueryを使用してスクリプトを書き直しました。とにかく私のブログで戦争の物語、興味がありますか。
他のヒント
多くのライブラリが行う厄介なトリックがありますが、これは私がはっきりと好みにしたもので、プロトタイプはこれらの1つであるように見えます。
Mootoolsがこれを行います。私が正しい場合、基本クラスのプロトタイプの多くをオーバーロードし、それらにパッチを適用します。
同様に、MootoolsとjQueryが存在する場合、Mootoolsによって何らかの方法でオーバーロード/モンキーパッチが適用されたオブジェクトメソッドを呼び出していたため、通常jQueryが停止するという奇妙な動作に遭遇しました。
また、不思議なことに、スクリプトの使用リストからmootoolsを除外すると、すべての実行速度がはるかに速くなりました。
今、私は間違っている可能性がありますが、私の経験から、そのようなライブラリは単に互いに共存することは好きではなく、mootoolsコードがどのように通常の処理が行われる速度を低下させるように見えるかを見て、すべてのmootoolsベースのコードを吸い上げてjQueryに移植しました(時間のかかる取引です)それは説明できませんでした。
移行は、少なくとも 1つのオプションとして検討することをお勧めします。
もう1つ書いておくと:
誰かが何らかの形で '$'を壊した場合の少し安全なカプセル化のために、私はすべてのjQuery駆動型コードでこの構文を使用する傾向があります。
ランタイムコード これは、実行する前にdocument.readyを待機します:
jQuery(function($){
code_with_多くのライブラリが行う厄介なトリックがありますが、これは私がはっきりと好みにしたもので、プロトタイプはこれらの1つであるように見えます。
Mootoolsがこれを行います。私が正しい場合、基本クラスのプロトタイプの多くをオーバーロードし、それらにパッチを適用します。
同様に、MootoolsとjQueryが存在する場合、Mootoolsによって何らかの方法でオーバーロード/モンキーパッチが適用されたオブジェクトメソッドを呼び出していたため、通常jQueryが停止するという奇妙な動作に遭遇しました。
また、不思議なことに、スクリプトの使用リストからmootoolsを除外すると、すべての実行速度がはるかに速くなりました。
今、私は間違っている可能性がありますが、私の経験から、そのようなライブラリは単に互いに共存することは好きではなく、mootoolsコードがどのように通常の処理が行われる速度を低下させるように見えるかを見て、すべてのmootoolsベースのコードを吸い上げてjQueryに移植しました(時間のかかる取引です)それは説明できませんでした。
移行は、少なくとも 1つのオプションとして検討することをお勧めします。
もう1つ書いておくと:
誰かが何らかの形で '$'を壊した場合の少し安全なカプセル化のために、私はすべてのjQuery駆動型コードでこの構文を使用する傾向があります。
ランタイムコード
これは、実行する前にdocument.readyを待機します:
(function($){
code_with_多くのライブラリが行う厄介なトリックがありますが、これは私がはっきりと好みにしたもので、プロトタイプはこれらの1つであるように見えます。
Mootoolsがこれを行います。私が正しい場合、基本クラスのプロトタイプの多くをオーバーロードし、それらにパッチを適用します。
同様に、MootoolsとjQueryが存在する場合、Mootoolsによって何らかの方法でオーバーロード/モンキーパッチが適用されたオブジェクトメソッドを呼び出していたため、通常jQueryが停止するという奇妙な動作に遭遇しました。
また、不思議なことに、スクリプトの使用リストからmootoolsを除外すると、すべての実行速度がはるかに速くなりました。
今、私は間違っている可能性がありますが、私の経験から、そのようなライブラリは単に互いに共存することは好きではなく、mootoolsコードがどのように通常の処理が行われる速度を低下させるように見えるかを見て、すべてのmootoolsベースのコードを吸い上げてjQueryに移植しました(時間のかかる取引です)それは説明できませんでした。
移行は、少なくとも 1つのオプションとして検討することをお勧めします。
もう1つ書いておくと:
誰かが何らかの形で '$'を壊した場合の少し安全なカプセル化のために、私はすべてのjQuery駆動型コードでこの構文を使用する傾向があります。
ランタイムコード
これは、実行する前にdocument.readyを待機します:
jQuery(function($){
code_with_多くのライブラリが行う厄介なトリックがありますが、これは私がはっきりと好みにしたもので、プロトタイプはこれらの1つであるように見えます。
Mootoolsがこれを行います。私が正しい場合、基本クラスのプロトタイプの多くをオーバーロードし、それらにパッチを適用します。
同様に、MootoolsとjQueryが存在する場合、Mootoolsによって何らかの方法でオーバーロード/モンキーパッチが適用されたオブジェクトメソッドを呼び出していたため、通常jQueryが停止するという奇妙な動作に遭遇しました。
また、不思議なことに、スクリプトの使用リストからmootoolsを除外すると、すべての実行速度がはるかに速くなりました。
今、私は間違っている可能性がありますが、私の経験から、そのようなライブラリは単に互いに共存することは好きではなく、mootoolsコードがどのように通常の処理が行われる速度を低下させるように見えるかを見て、すべてのmootoolsベースのコードを吸い上げてjQueryに移植しました(時間のかかる取引です)それは説明できませんでした。
移行は、少なくとも 1つのオプションとして検討することをお勧めします。
もう1つ書いておくと:
誰かが何らかの形で '$'を壊した場合の少し安全なカプセル化のために、私はすべてのjQuery駆動型コードでこの構文を使用する傾向があります。
ランタイムコード
これは、実行する前にdocument.readyを待機します:
<*>
jQueryプラグイン
<*>
これらを使用すると、競合する問題をあまり起こさずに、使用するjQueryを使用することが容易になります。
これは基本的に、コードが本当に魔法のようなことをしていないことを確認するためにそれらを残すでしょう。
here;
});
jQueryプラグイン
<*>
これらを使用すると、競合する問題をあまり起こさずに、使用するjQueryを使用することが容易になります。
これは基本的に、コードが本当に魔法のようなことをしていないことを確認するためにそれらを残すでしょう。
here;
})(jQuery);
jQueryプラグイン
<*>
これらを使用すると、競合する問題をあまり起こさずに、使用するjQueryを使用することが容易になります。
これは基本的に、コードが本当に魔法のようなことをしていないことを確認するためにそれらを残すでしょう。
here;
});
jQueryプラグイン
<*>これらを使用すると、競合する問題をあまり起こさずに、使用するjQueryを使用することが容易になります。
これは基本的に、コードが本当に魔法のようなことをしていないことを確認するためにそれらを残すでしょう。
他のライブラリでのJQueryの使用について、JQueryサイトでこの記事を読む価値があります。 noConflictオプション以外にも対処します。
すべてのjQueryプラグインにはプロトタイプバージョンがあり、すべてのプロトタイププラグインにはjQueryバージョンがあるため、よく検索する必要があると思います。 見た目が本当に見つからず、ライブラリを1つしか使用できない場合は、こちら at
jQuery.noConflict();
繰り返しますが、各ライブラリに15〜20 kbを超えるロードは意味がないと思います:)