【问题标题】:Angular replacewith in directive and mouseenter/mouseleave指令和 mouseenter/mouseleave 中的角度替换
【发布时间】:2016-11-06 07:43:46
【问题描述】:

我的目标很简单。图像上会有一个 show-overlay 指令。如果您输入鼠标,它将用父跨度包装并附加覆盖。在 mouseleave 上,它将删除父跨度和覆盖 div。 但是由于某种原因,如果我在 mouseleave 上使用 replaceWith 会导致下一次进入时意外触发 mouseenter 多次。

指令如下

app.directive('showOverlay', function($compile) {
    return {
        restrict: 'A',
        link: function($scope, $element, attrs) {

            $element.on('mouseenter', function (e) {
                console.warn('mouseenter');
                $el = $element.wrap("<span class='img'></div>")
              $el = $el.parent().append("<div  ng-mouseleave='cancelEditMode($event)' class='overlay'></div>");
                $element.parent().addClass("hover");
              var inputElem = $element.parent();
              $compile(inputElem)($scope);
            });

            $scope.cancelEditMode = function(e) {
                $element.parent().replaceWith($element);
            };
        }
    };
});

从上面的代码,看起来 replacewith 导致 $element 有多个 mouseenter 事件。 jsfiddle 在这里:http://jsfiddle.net/RmDuw/979/

【问题讨论】:

    标签: angularjs directive


    【解决方案1】:

    我可以建议这种更有效的方法(使用 CSS :hover 而不是 JS)来实现相同的目标:

    JS

    app.directive('showOverlay', function($compile) {
        return {
            restrict: 'A',
            link: function($scope, $element, attrs) {
                $el = $element.wrap("<span class='img hover'></div>")
                $el = $el.parent().append("<div class='overlay'></div>");
            }
        };
    });
    

    其他 CSS

    .img .overlay {
      display: none;
    }
    .img:hover .overlay {
      display: block;
    }
    

    jsfiddle http://jsfiddle.net/0aj5osw0/

    【讨论】:

    • 感谢 elfan,但问题是我不能在 dom 中留下一些原本不存在的额外元素。我的意思是,我必须删除额外的元素,如最后的 span、orverlay div。
    【解决方案2】:

    这里是解决办法

    html代码

    <div ng-controller="MyCtrl" >
     <overlay   class='overlay'></overlay>
     <img show-overlay src="http://www.queness.com/resources/images/png/apple_raw.png" />
    </div>
    

    javascirpt

    app.directive('showOverlay', function($compile) {
    return {
        restrict: 'A',
        link: function($scope, $element, attrs) {
           $element.bind('mouseenter', function() {
                 angular.element('overlay').addClass('showContent')
            })  
            angular.element('overlay').bind('mouseleave', function() {
                 angular.element('overlay').removeClass('showContent')
            })
    
        }
     };
    });
    

    css

     [editable]:hover {
        cursor: pointer;
        border: dotted thin rgba(0, 191, 255, 0.5);
    }
    
    .img {
      position: relative;
      margin-bottom: 5px;
      overflow: hidden;
    
    }
    .overlay {
      position: absolute;
      z-index: 20;
      width:400px;
      height: 400px;
      background-color:red;
      display: none;
    }
    .showContent{
      display: block;
       z-index: 20;
    
    }
    .hideContent{
      display: none;
      z-index: 0;
    
    }
    

    【讨论】:

    • 请提供任何 jsfiddle 链接?
    • 只需将我的代码复制并粘贴到您的项目中即可。
    • 谢谢,但它使用了我不想要的固定大小的叠加层
    • ok 进入 mouseenter 动作,你可以读取父级的高度和宽度,然后只需应用高度和覆盖。
    • 如果 dom 中只有图像,则您的解决方案将起作用,没有别的
    猜你喜欢
    • 2023-03-23
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多