【问题标题】:Highlight area element with jquery使用 jquery 突出显示区域元素
【发布时间】:2016-08-16 00:51:34
【问题描述】:

我是 javascript 的初学者。

这是我的 javascript:在地图“演示”中,代码​​将所有区域元素推入数组 elementPositions。当用户将鼠标悬停在区域元素上时,它将被推入数组 hoveredElements。然后对于 hoveredElements 中的每个区域元素,覆盖 id 标记显示,我希望区域元素(矩形)也显示。我试过 '$(this).show()' 但这不起作用...

这是一个典型的区域元素:

<map name="demo" id="demo">
<area shape="rect" coords="400,400,500,499" href="#" id="r6067" alt="r6067">
</map>
<div class= "cont" style="display:none" id="overlayr6067"> mdtBIL1C09 </div>

我已经接受了 Nikolay 在下面对我的 javascript 的重构,这是我在 jsfiddle 中的代码:https://jsfiddle.net/sfs1926/wacd5bv5/1/

【问题讨论】:

  • 感谢您的编辑,帕拉什!也许你对我如何进行有什么建议?
  • actual rectangle 是什么?是区域元素吗?
  • 是的,所有的区域元素都是矩形。
  • 我认为我的问题与这个问题相似-除了这个人实际上设法使突出显示工作stackoverflow.com/questions/2311010/…
  • 我认为你的错误是,你的 this,在你的 mousemove 函数中是指身体而不是你每个循环中的元素,虽然我也不确定你是否真的包含了你的 mousemove - 是否有意在每个循环中发生事件。

标签: javascript jquery html


【解决方案1】:

您可以使用hoveredElements[ih].element.show() 来完成。

或者item.element.show();,如果你遵循我在下面重构的代码。

if ( $('#demo').length >0 ) {

    var elementPositions = []; // didn't find it declared in your code

    $('#demo area').each(function() {

        var offset = this.coords,
            coordarray = offset.split(","),
            left = coordarray[0],
            top = coordarray[1],
            right = coordarray[2],
            bottom = coordarray[3],
            id = this.id,
            hoveredElements = [];

        elementPositions.push({
            element: $(this),
            top: top,
            bottom: bottom,
            left: left,
            right: right,
            id: id,
        });



        $("body").mousemove(function(e) {

            /*
            for (var ih = 0; ih < hoveredElements.length; ih++) { //for loop over all hovered elements

                var id = hoveredElements[ih].id;
                $('#overlay' + id).hide();
            }
            */

            hoveredElements.forEach( function(item) {
                item.overlay.hide();
            });

            hoveredElements = [];

            var xPosition = e.pageX;
            var yPosition = e.pageY;

            for (var ie = 0; ie < elementPositions.length; ie++) {
                var test = elementPositions[ie].id;
                if (xPosition >= elementPositions[ie].left &&
                    xPosition <= elementPositions[ie].right &&
                    yPosition >= elementPositions[ie].top &&
                    yPosition <= elementPositions[ie].bottom) {
                    // The mouse is within the element's boundaries

                    hoveredElements.push({
                        element: elementPositions[ie].element,
                        overlay: $('#overlay' + test), // store overlay too
                        id: test
                    });
                }
            } //end of for loop over all elements

            /*
            for (var ih = 0; ih < hoveredElements.length; ih++) { //for loop over all hovered elements
                var id = hoveredElements[ih].id;
                $('#overlay' + id).show();
                $(this).show(); // ???
            }
            */

            hoveredElements.forEach( function(item) {
                item.overlay.show();
                item.element.show();
            });

        });
    });

}

【讨论】:

  • 谢谢尼古拉!我已经按照您的建议进行了重构,并且覆盖层很好。但是该元素仍然没有显示。如果确实显示,我应该期待什么?
  • 当你推送到hoveredElements而不是element: $(this)时,你确定你有element: elementPositions[ie].element吗?
  • 我已经做到了。我想知道你的最后两个括号,它们不应该是 }) 然后是 } 吗?我还想知道您是否意味着在 mousemove 函数执行后关闭“$('#demo area').each(function()”...
  • 是的,你对括号很紧张。实际上,由于您没有将这些区域隐藏在任何地方,因此您不需要明确地show 它们。我认为您应该将图像的opacity: 0; 更改为其他内容。否则它是绝对透明的,但实际上并没有隐藏。 jQuery show/hide 方法与 display:none; css 规则相关,而不是不透明度。
  • 我已经编辑了我的问题,向您展示了具有相应 div(覆盖)的典型区域元素...我对更改不透明度的意思感到困惑
猜你喜欢
  • 2010-10-29
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多