Drupal 7がJavaScriptとjQueryを処理する方法の変更


14

現在、管理ページで実行されるJavaScriptスクリプトを開発しています。Drupal 7で行われた変更、つまりdocument.ready()独自のjQuery関数への移行について調べました。ただし、次のスクリプトは機能しません。

(function ($) {
  console.log('hello');
  $('#edit-apiusername').append('test');
})(jQuery);

console.log()が発射され、出力を確認できますが、単純な追加は機能しません。フィールドIDは正しいです。
ここで何が欠けているのかわかりませんが、オブジェクトを参照している方法に関係しているのではないかと思います。Views 3 JavaScriptコードを見ると、同様の方法で行われていることがわかります。


console.log($( '#edit-apiusername'));の場合 オブジェクトを出力しますか?つまり、jQueryによってページ上で要素が見つかりますか?
budda

Drupal 6でも、の代わりにDrupalの動作を使用することになっていたdocument.ready。あなたが報告されていることのDrupal 7に固有ではありません
kiamlaluno

回答:


28

変化を誤解したと思います。

のショートカットとしての(function ($) { ... })(jQuery);使用を許可するには、JavaScriptコードをラップする必要があります。これができるようにすることですjQueryのは、他のライブラリとうまくプレーします。この関数では、DOMを変更する場合は、DOMがロードされるのを待つ必要があります。それがあなたのコードをラップすることです。$jQueryjQuery.ready(function(){ ... })

ただし、を使用する代わりにjQuery.ready(function(){ ... })ビヘイビア使用して、DOMから追加(または削除)されたコードをコードが処理することをDrupalのJavaScriptに知らせる必要があります。

(function ($) {
  Drupal.behaviors.exampleModule = {
    attach: function(context, settings) {
      $(context).find('#edit-apiusername').append('test');
    }
  }
})(jQuery);

1

次のように、jQueryオブジェクト全体を選択した別の変数にエイリアスすることも検討できます。

$j = jQuery.noConflict();

これをreadyステートメントの外側に置き、カプセル化の外側でアクセスできるようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.