2

jQuery 新手,但对它非常着迷并且非常喜欢它。但是,这个问题开始让我失望。非常感谢任何帮助。上周花了很多时间试图从中做出正面或反面。如果此问题之前已发布,我深表歉意。

我有一个产品清单。每个产品都包含在一个<div>. <span>每个 div 内部都有一个用于产品信息的浮动对象和一个<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)上的操作,所需的过程是:

  • 悬停将显示一个带有一些产品信息和一些详细信息(例如价格)的小弹出窗口。
  • 点击将显示(动画)一个半透明的叠加层和一个 <div id="frame"> 包含有关产品的所有信息,包括照片。

我在框架内有一个图像,单击该图像会隐藏覆盖/框架。
使用 jQuery Ajax 提取信息(包括照片)$.get()
使用 jQuery,我能够在第一遍(第一次点击)中实现这一点。但是,在我关闭“框架”并隐藏叠加层,然后将鼠标悬停在任何“prodInfo”上之后,它会显示应有的小弹出窗口,但同时也会显示叠加层和“框架”,就好像我一样调用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上的下一个鼠标悬停实际上会调用鼠标悬停和单击(显示覆盖/框架)。

编辑:感谢所有回复的人。我将尝试使用您的每个建议对其进行调试。

编辑(2): Mahalo给所有评论和回复的人。

4

3 回答 3

1

我无法完全想象您拥有的整个设置,但这是我首先想到的。这可能是事件冒泡的情况,将单击事件同时传递给关闭按钮和跨度。也许当您单击关闭事件时,跨度单击也可能触发,但框架被关闭事件隐藏。查看绑定函数以获取有关停止默认操作和事件冒泡的更多信息:http: //jquery.bassistance.de/api-browser/#bindStringObjectFunction

正如 Don 所提到的,示例 URL 肯定会有很大帮助!

编辑:

经过进一步检查,我认为这是您在 click() 事件中附加 ajaxSuccess 事件的方式。每当发出任何 ajax 请求时,它可能仍然处于活动状态并触发。

再次编辑:

我刚刚用我自己的代码测试证实了这一点,这似乎肯定是问题所在。事实上,每次点击它都会附加 ajaxSuccess 函数,所以如果你点击了五次,它就会执行五次该函数。由于 AJAX 请求是在 mouseover 事件中发出的,因此它还会触发先前附加的 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' ) {
于 2009-04-03T19:56:52.617 回答
0

我要赌一把,并说问题是您在第一次鼠标悬停/单击时生成/显示弹出窗口,然后将其渲染为不透明。在第二次鼠标悬停时,看起来旧的 div 被抓住并再次可见。

除此之外,如果您可以提供一个链接到您遇到此问题的页面的 URL,我可以更深入地了解一下。

于 2009-04-03T19:44:12.880 回答
0

问题可能是您没有隐藏鼠标悬停时单击时创建的内容。因此,当您再次将鼠标悬停时,您将显示第一个,但由于第一个现在包含单击事件项,因此它也显示它。您需要在鼠标悬停时隐藏单击事件项,因此它也不会显示。

于 2009-04-03T20:21:17.207 回答