Как написать JavaScript на Drupal с помощью drupal.behaviours

У меня есть сетка, которая содержит две строки и три столбца. В каждом столбце есть изображение, заголовок и подзаголовок. Все картинки имеют один и тот же класс, скажем, "изображение". Я хочу, чтобы картинка менялась во время наведения. У меня есть div с другим изображением (которое я хочу показать при наведении) со свойством display: none;

Это HTML-код:

<div class="row-1">
    <div class="col-1">
        <div class="view-field-image">
            <div class="field-content">
               <img class="image" src="../.." al="">
            </div>
        </div>
        <div class="view-field-collapsed">
            <div class="field-content">
               <img class="collapsed" src="../.." al="">
            </div>
        </div>
     </div>
     <div class="col-2">
     </div>
     <div class="col-3">
     </div>
</div>

Это код js:

(function ($, Drupal) {

  'use strict';

  Drupal.behaviors.hoverEffect = {
    attach: function (context, settings) {

      $('.view-field-image .field-content', context)
        .once()
        .each( function () {
          $(this, context)
          .mouseenter( function () {
            console.log('enter');
            $('image', context).css('display', 'none');
            $('.collapsed', context).css('display', 'block');
          })
          .mouseleave( function () {
            console.log('leave');
            $('image', context).css('display', 'block');
            $('.collapsed', context).css('display', 'none');
          });
        });
    }
  };

})(jQuery, Drupal);

У меня нет ожидаемого результата. При наведении курсора на картинку все картинки показывают скрытую картинку со свернутым классом. Кроме того, изображение с class= "image" не исчезает.

2 ответа

Поработав некоторое время с javascript, я понял, что вы можете просто сделать это с помощью CSS, Javascript не нужен.

Вам просто нужно добавить класс к столбцам, в случае этого примера это image-col,

.image-col {
  width: 200px;
  height: 100px;
  position: relative;
}
.image-col > div {
  position: absolute;
  width: 100%;
  height: 100%;
}
.image-col img {
  width: 100%;
  height: 100%;
}
.image-col .view-field-image {
  z-index: 10;
}
.image-col .view-field-collapsed {
  z-index: 1;
}
.image-col:hover .view-field-image {
  display: none;
}
<div class="row-1">
    <div class="col-1 image-col">
        <div class="view-field-image">
            <div class="field-content">
               <img class="image" src="https://searchengineland.com/figz/wp-content/seloads/2015/09/google-logo-green2-1920.jpg" al="">
            </div>
        </div>
        <div class="view-field-collapsed">
            <div class="field-content">
               <img class="collapsed" src="https://searchengineland.com/figz/wp-content/seloads/2015/11/google-stars-reviews-rankings5-ss-1920.png" al="">
            </div>
        </div>
     </div>
     <div class="col-2 image-col">
     </div>
     <div class="col-3 image-col">
     </div>
</div>


После публикации я увидел, что проблема, вероятно, не в том, как используется переменная контекста.

Но я оставляю ответ здесь по запросу ОП.

Оригинальный (неправильный) ответ

Вы используете неверную контекстную переменную.
контекст будет то, что jquery изучает, чтобы найти элемент.
например.
$('.something', context)
jquery будет искать ".something" внутри контекста.

Ваш код использует: $('image', context).css('display', 'none'); но, поскольку это в цикле, вы действительно хотите, чтобы контекст был текущим элементом в цикле.
Таким образом, каждый ваш цикл должен выглядеть так:

.each( function (index, element) {
  let $this = $(this);
  .mouseenter( function () {
    // Search for image in the current looping element.
    $('image', $this).css('display', 'none');
    // Search for all collapsed
    $('.collapsed', context).css('display', 'block');
  })
   (function ($, Drupal, drupalSettings) {

        Drupal.behaviors.YOURBEHAVIOR = {

            attach: function (context, settings) {

                $('.YOURCLASS', context).on('YOUREVENT', function () {

            alert('TEST STRING...');  //Your javascript code...

            });

            }
        };
    })(jQuery, Drupal, drupalSettings);
Другие вопросы по тегам