Colorboxオーバーレイ内にノードをロードするcolorboxノードを使用します。 colorboxの内部で、jqueryスクリプトをロードして、内部のすべてのリンクにいくつかのパラメーターを追加します。ただし、ロードは2つのajax呼び出しによって行われ、すべてのリンクでパラメーターが2倍になります。 .once()を使用しようとしましたが、何も返されません。おそらく、最初のajax呼び出しの後に起動するためです。 2番目のajax呼び出しまで待つ方法は?ありがとうございました。
私のスクリプト:
(function($){ // Create local scope.
Drupal.behaviors.jjj = {
attach: function (context, settings) {
$('#colorbox #block-book-navigation a', context).once('jjj', function () {
$("#colorbox #block-book-navigation a").each(function(){
$(this).addClass("xxx");
console.log( "test" );
});
});
}};
})(jQuery);
私はそれを考え出した。誤ったコードが.once関数の誤解から生じました。 「nav」は、セレクター#colorbox#block-book-navigationがマークされるクラスを意味するため、そのセレクターでコードが複数回起動されることはありません。 http://codekarate.com/blog/drupal-7-prevent-duplicating-javascript-behaviors 正しいコードは次のようになります:
(function ($) {
Drupal.behaviors.myCustomJS = {
attach: function(context, settings) {
$('#colorbox #block-book-navigation').once('nav', function() {
$("#colorbox #block-book-navigation a").each(function(){
$(this).addClass("colorbox-node");
});
});
}
};
})(jQuery);
あなた自身の答えを改善するためのいくつかのこと...
セレクター「#colorbox#block-book-navigation」に一致する2番目の要素が追加された場合、addClass()は、すでに実行されているものを含む両方の要素のすべてのアンカータグで再度実行されます。
このコードはいくつかの問題を修正します:
(function ($) {
Drupal.behaviors.myCustomJS = {
attach: function(context, settings) {
$('#colorbox #block-book-navigation', context).once('nav', function() {
$("a", this).addClass("colorbox-node");
});
}
};
})(jQuery);
メモ:
このコードは、ロジックの不要な繰り返しを防ぐという点で、パフォーマンスが高く(jQueryによるDOMトラバーサルの実行が少ない)、より堅牢である必要があります。
現在、他のソリューションでは、他のajax呼び出しで既存の#colorbox #block-book-navigation
内にタグが挿入されていないと想定しています。
このソリューションはその場合にも機能し、他の目的でeachループを使用しない限り、他のソリューションよりも少し単純です。
Drupal.behaviors.jjj = {
attach: function(context, settings) {
$('#colorbox #block-book-navigation a', context).once('jjj').addClass('xxx');
}
};
試して頂けますか?
(function($) {
// Create local scope.
Drupal.behaviors.jjj = {
attach: function (context, settings) {
$('#colorbox #block-book-navigation', context).once('jjj', function () {
$(this).find('a').addClass('xxx');
});
}
};
}) (jQuery);