jQuery при наведении курсора мыши - PullRequest
2 голосов
/ 03 апреля 2009

Новичок в jQuery, но очень увлечен им и действительно любит его. Начинаю меня выключать, правда, с этой проблемой. Буду очень признателен за любую помощь. Потратил последнюю неделю, пытаясь сделать из этого головы или хвосты. Я прошу прощения, если эта проблема была опубликована ранее.

У меня есть список товаров. Каждый продукт заключен в <div>. Внутри каждого div есть всплывающее <span> для информации о продукте и <a> для перехода по соответствующему URL продукта. Этот список создается программно с использованием ASP.NET.

<div id="prod1">
   <span id="infoProd1" class="prodInfo" />
   <a class="prodURL" href="url1">Name of product #1</a>
</div>
   :
   :

К сожалению, у меня нет URL-адреса, поскольку это только на платформе разработки за брандмауэром. Сайт выглядит примерно так, как показано ниже. Надеюсь, это поможет.

+----------+------------------------------+
|  #prod1  |                              |
+----------+                              |   Each #prodNum div looks like:
|  #prod2  |    overlay and frame divs    |
+----------+       appear over here       |  +-- #prod1 -----------------+
|  #prod3  |     with product details     |  |               |           |
+----------+       only if .prodInfo      |  |  .prodURL     | .prodInfo | 
|          |         is clicked.          |  |               |           |
|    :     |                              |  +---------------------------+
|          |                              |   
+----------+------------------------------+

Информация о каждом продукте (включая фотографию) хранится в базе данных.
В зависимости от действий пользователя над диапазоном (, т.е. prodInfo ), желаемым процессом будет:

  • hover отобразит небольшое всплывающее окно с некоторой информацией о продукте и некоторыми деталями (например, цена).
  • click покажет (анимировать) полупрозрачный оверлей и
    , содержащий всю информацию о продукте, включая фотографию.

У меня есть изображение внутри рамки, которое при щелчке скрывает оверлей / рамку.
Информация (включая фотографию) извлекается с помощью jQuery Ajax $.get().
Используя jQuery, я смог добиться этого на первом проходе (первый click ). Однако после того, как я закрою «frame» и скрою оверлей, а затем hover над любым «prodInfo», он отобразит маленькое всплывающее окно, как и должно быть, но в то же время ТАКЖЕ ОТКРЫВАЕТ оверлей и "frame", как будто я вызвал click .

Вот упрощенный код jQuery для двух событий:

$(".prodInfo").mouseover(
  function(e) {   // function fired when 'moused over'
    var popupItem = $("#div_infoPopupItem");  // absolute positioned popup
    var prod = $(this).attr('id');
    var prd;

    popupInit(popupItem, e); // changes the top/left coords

    $.ajax({            
      type    : 'GET',
      url     : 'prodInfo.aspx',
      data    : 'id=' + prod,
      success :

        function(prodInfo, status) {
          var prodStr = '<b>No product name.</b>';

          prd = prodInfo.split('::');  // product info delimited by '::'
          prodStr = '<div class="popupInfo_head">' + prd[0] + '</div>' +
                    '<div style="margin:2px;">' + prd[1] + '</div>';
                    // and so on...

          popupItem.html(prodStr);
          return false;
        },
    error :
      function() {
        popupItem.html('Error in collecting information.');
      }
    });

    popupItem.animate({ opacity : .94 }, { queue:false, duration: 120 });
    return false;
  }
);

$(".prodInfo").click(
  function(e) {
    var prod    = $(this).attr('id');
    var frame   = $("#div_frame");
    var overlay = $("#div_overlay");
    var info;
    var img     = new Image();

    document.getElementById('div_frame').scrollTop = 0;
    $.get('prodInfo.aspx', { id: prod },
      function (result) {
        info = result.split(';;');     // name ;; status ;; description ;; price, etc.

        $(this).ajaxSuccess(
          function (e, request, settings) {
            img.src = 'prodImage.aspx?id=' + prod;
            img.id  = 'prodImg';

            //populate the frame with prod info
            $(img).load(function () {
              $("#prodInfoImage")
                  .css('background', 'transparent url("prodImage.aspx?id=' + prod + '") no-repeat 50% 50%');
              switch (info[1]) {
                case '0':
                    $("#prodStatus")
                        .removeAttr("class")
                        .addClass("status_notavail")
                        .text('Not available');
                        break;
                case '1':
                    $("#prodStatus")
                        .removeAttr("class")
                        .addClass("status_avail")
                        .text('Available');
                        break;
              } // switch

              $("#prodInfoDesc")
                  .empty()
                  .append(info[2]);
              $("#prodInfoExtra")
                  .empty()
                  .append(info[3]);

              $("#prodName").text(info[0]);
            }
          )
          .error(
            function() {
              return false;
            }
          );  // image load

          // animate overlay, frame and display product info
          overlay .animate({ top   : '0' }, { queue: false, duration: 280 })
                  .animate({ height: '100%' }, 280, '',
                    function() {
                      frame.animate({ opacity : .92 }, 320);
                      return false;
                    }
                  );
          return false;
          }
        );     // ajax success
      }
    );  // get
  }
);

Ниже приведено определение события «близкого» изображения, расположенного внутри кадра.

$("#img_close").click(
  function (e) {
    $("#div_frame")
      .animate({ opacity: 0}, 100, '', 
        function() {
          $("#div_overlay")
            .animate({ top   : "50%" }, { queue: false, duration: 120 })
            .animate({ height: "0px" }, 120);
        }
      );

      return false;
  }
);

Как уже упоминалось, это будет работать, как и планировалось, только до первого клика. После того, как я нажму prodInfo span и закрою фрейм / оверлей, следующее наведение мыши на prodInfo фактически вызывает ОБА мыши и ТАКЖЕ щелчок (который показывает наложение / фрейм ).

EDIT: Спасибо всем, кто откликнулся. Я постараюсь отладить его, используя каждое из ваших предложений.

EDIT (2): Махало для всех, кто прокомментировал и ответил.

Ответы [ 3 ]

1 голос
/ 03 апреля 2009

Я не могу представить себе всю вашу установку, но это было первое, что пришло на ум. Это может быть случай всплывающего события, когда событие click передается как кнопке закрытия, так и промежутку. Возможно, когда вы щелкнете по событию закрытия, щелчок диапазона также может сработать, но фрейм будет скрыт событием закрытия. Проверьте функцию связывания для получения дополнительной информации об остановке действия по умолчанию и всплывающих событий: http://jquery.bassistance.de/api-browser/#bindStringObjectFunction

Как уже упоминал Дон, пример URL определенно очень поможет!

Edit:

После дальнейшего изучения я думаю, что именно так вы присоединяете событие ajaxSuccess к событию click (). Он может быть активным и активным всякий раз, когда выполняется ЛЮБОЙ запрос ajax.

Редактировать, снова:

Я только что подтвердил это своим собственным тестом кода, и это определенно является проблемой. Фактически, он присоединяет функцию ajaxSuccess при каждом нажатии, поэтому, если вы щелкнули пять раз, она выполняет эту функцию пять раз. Поскольку в событии mouseover выполняется запрос AJAX, он также запускает ранее присоединенные функции ajaxSuccess и показывает ваши оверлей и кадр.

Чтобы обойти это, попробуйте следующее:

Вместо:

    $.get('prodInfo.aspx', { id: prod },
  function (result) {
    info = result.split(';;');     // name ;; status ;; description ;; price, etc.

    $(this).ajaxSuccess(

Попробуйте:

    $.get('prodInfo.aspx', { id: prod },
  function (result, statusText) {
    info = result.split(';;');     // name ;; status ;; description ;; price, etc.

    if ( statusText == 'success' ) {
0 голосов
/ 04 апреля 2009

проблема может заключаться в том, что вы не скрываете то, что было создано при щелчке при наведении мыши. Итак, когда вы снова наводите курсор мыши, вы показываете первый, но, поскольку первый теперь содержит элемент события click, он также показывает его. Вы захотите скрыть элемент события click при наведении курсора, чтобы он также не отображался.

0 голосов
/ 03 апреля 2009

Я собираюсь взять понт и сказать, что проблема в том, что вы генерируете / отображаете всплывающее окно при первом наведении курсора / щелчке, а затем просто делаете его непрозрачным. При втором наведении курсора мыши выглядит так, будто старый элемент div снова становится видимым.

Кроме этого, если бы вы могли предоставить URL-ссылку на страницу, где у вас есть эта проблема, я мог бы взглянуть глубже.

...