viewer.min.js点击空白区域关闭当前图片

469 阅读2分钟

需求

目前插件提供的是点击右上角的叉号关闭,但是产品想要优化成,点击空白区域也可关闭当前图片

问题

题主目前用的是js版本,不依托与jq

方案1

当时理所当然的想到了一种方案,有事找度娘。 找到了此篇链接:www.cnblogs.com/maoye520/p/… 虽然能用,但是这篇答主用的是jq,在我们项目中引用的地方改动地方有7处,工作量太大

方案2

鉴于第一种方案太麻烦,所以想出来了第二种解决方案,自己去写jq,监听空白区域的元素,点击后,直接隐藏当前当前元素就行

 //由于是未来元素,需要用on去找元素
  //点击外层隐藏图片
  $('.box-body').on('click', '.viewer-fixed', function () {
    console.log('点击触发初始化')
    $(this).removeClass('viewer-in').addClass('viewer-hide')
  })

  //点击图片,阻止 点击外层隐藏图片事件
  $('.box-body').on('click', '.viewer-canvas', function (e) {
    //阻止事件冒泡
    e.stopPropagation()
  })

  //点击工具栏,阻止 点击外层隐藏图片事件
  $('.box-body').on('click', '.viewer-footer', function (e) {
    //阻止事件冒泡
    e.stopPropagation()
  })

不过这样会有以下问题:

  1. 需要阻止工具栏的点击外层事件(已解决)
  2. 需要阻止图片的外层点击事件(已解决)
  3. 因为我们是通过隐藏方式,导致第二次打开时候,会出现第一次预览的图片,效果不是特别友好

方案3

然后就想着通过事件委派,用外层盒子去委派关闭按钮class的方法,但是实验证明,class没有绑定click事件,分析元素发现,它有一个 data-action="mix",跟踪源码后发现,这个就是点击事件的属性。 最终更改方案:

找到源码的class="viewer-container",后面添加属性data-action="mix"


//这里增加一个属性即可
O.TEMPLATE = '<div class="viewer-container" data-action="mix">......</div>';

总结: 一步步来,总有最简单的实现方式