11

私は 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'));
}

noConflictsまた、jQueryメソッドを使用して解決される jQuery と Prototype の間に競合が発生する可能性があることも認識しています。いろいろなところから電話をかけてみましたがだめでした。これは問題ではないと思います。なぜなら、a)noConflict関数は$変数のみに関連しているため、ここでは問題ではないようです.b)ワードプレスがそれを整理してくれるので...

最後に、Venkman デバッガーを使用してelement、エラー メッセージで参照されている は実際には であるHTMLDocumentが、 も欠落していると判断しましたdispatchEvent。これが標準の DOM メソッドであることを考えると、これがどのように起こるかわかりませんか?

4

4 に答える 4

11

多くのライブラリで行われている厄介なトリックがあり、私はこれが特に気に入っています。prototype もその 1 つです。

Mootools はこれを行います。私が正しければ、基本クラスのプロトタイプの多くをオーバーロードし、モンキー パッチを適用する必要があります。

同様に、mootools と jQuery が存在するときも同様に奇妙な動作に遭遇しました。通常は、Mootools によってオーバーロード/モンキー パッチが適用された何らかのオブジェクト メソッドを呼び出していたため、jQuery が停止していました。

また、不思議なことに、mootools をスクリプト使用リストから除外すると、すべての実行が大幅に高速化されました。これは、オブジェクト汚染が少ないためであると結論付けました。

今は間違っているかもしれませんが、私の経験から、そのようなライブラリは単に共存するのが好きではないと結論付けました.mootoolsコードが通常の処理速度を低下させているように見えるのを見て、私は吸い込まれました.すべての mootools ベースのコードを jQuery に移植し (時間のかかる取引であると断言します)、その結果、高速 で、説明のつかない奇妙なエラーのないコードが作成されました。

少なくとも選択肢の1 つとして移行を検討することをお勧めします。

もう1つ、書くとき:

私はすべての jQuery 駆動コードでこの構文を使用する傾向があります。これは、何らかの理由で誰かが '$' を壊した場合に少し安全にカプセル化するためです。

ランタイム コード これは、実行する前に document.ready を待機します。

 jQuery(function($){ 
      code_with_$_here; 
 }); 

jQuery プラグイン

(function($){ 
    code_with_$_here; 
})(jQuery); 

これらを使用すると、たまたま作成した jQuery を使用している人々が、競合の問題をあまり起こさずに簡単に使用できるようになります。

これにより、基本的に、コードが本当に魔法のようなことをしていないことを確認する必要があります。

于 2009-01-06T06:27:05.697 に答える
6

Using JQuery With Other Librariesに関する JQuery サイトのこの記事を読む価値があります。noConflict オプション以上のものを扱います。

于 2009-01-06T06:48:55.373 に答える
5

すべての jQuery プラグインにはプロトタイプ バージョンがあり、すべてのプロトタイプ プラグインには jQuery バージョンがあるため、よく検索する必要があると思います。見た目が本当に見つからず、1 つのライブラリしか使用できない場合は、こちらをご覧ください。

jQuery.noConflict();

しかし、繰り返しになりますが、ライブラリごとに 15 ~ 20kb 以上をロードするのは意味がないと思います :)

于 2009-01-06T12:42:09.917 に答える
0

すべての提案をありがとう。結局、ケントさんの説明が一番近かったと思います。(私があなたを間違って要約していたらごめんなさい:)

オプションについてjQuery.noConflictは、質問ですでに言及しました。このメソッドを実行すると違いが生じますが、私はそれをほとんど制御できません。私が言ったように、いくつかの異なる場所 (具体的にはページ ヘッダーとスクリプト ファイルから) で実行しようとしましたが、効果がありませんでした。したがって、私たち全員が望んでいるのと同じように、「ただ使用するだけnoConflict」は、少なくとも追加情報がなければ、この質問に対する答えではありません.

また、変数についてのjQuery.noConflict よう$で、エラーポイントの周りのコードはその変数をまったく扱っていません。もちろん、それらは間接的に関連している可能性がありますが、追跡していません.

したがって、基本的には、実際には独自の問題があった Prototype の代わりに jQuery を使用してスクリプトを書き直すことになりました。とにかく、私は自分のブログに戦争の全貌を公開しました。

于 2009-01-11T22:23:21.653 に答える