如何使用 addEventListener(webkitTransitionEnd) 在 window.close() 之前延迟?

Posted

技术标签:

【中文标题】如何使用 addEventListener(webkitTransitionEnd) 在 window.close() 之前延迟?【英文标题】:How to delay before window.close() with addEventListener(webkitTransitionEnd)? 【发布时间】:2015-04-04 22:49:55 【问题描述】:

我对 JS 不是很精通,也无法理解如何对我的问题应用类似的答案,因此我非常感谢您的帮助和建议。


我在做什么: 我正在开发一个 webview 弹出窗口。它底部有一个关闭按钮,我希望它的动画效果与应用内按钮相同。

我是怎么做的: 我目前只是用<a href="#" onclick="window.close(); return false;"><img class="button" src="img.png"></a> 关闭它。

我有一个在 img.button:active 模式下变化的 webkit 动画。

我的问题: 我希望在窗口关闭之前完成过渡。我知道我必须使用addEventListener 来检查转换何时结束,但我似乎无法使用window.close() 正确执行此操作。有没有好的方法来做到这一点?


我整天阅读大量文档都无法弄清楚这一点。

【问题讨论】:

【参考方案1】:

您可以收听在元素 img.button 上触发的事件 transitionend,它表示 CSS 转换的结束。但是,由于浏览器对 transitionend 的支持不完整(尽管所有最新版本的 Chrome、Firefox 和 Safari 都原生支持 transitionend,但没有供应商前缀),您应该通过 use this script 来找出实际支持的事件。

关于标记,我强烈建议避免使用内联 JS,而是设置一个事件监听器。

<a href="#" id="closeWindow"><img class="button" src="http://placehold.it/100x100" /></a>

我的脚本还假设页面上可能有多个img.btn 元素,因此我们必须遍历与选择器匹配的所有元素。如果不是这种情况,您可以简单地使用document.querySelector 并放弃循环。

// Determine which transntionend event is supported
function whichTransitionEvent() 
    var t,
        el = document.createElement("fakeelement");

    var transitions = 
        "transition"      : "transitionend",
        "OTransition"     : "oTransitionEnd",
        "MozTransition"   : "transitionend",
        "WebkitTransition": "webkitTransitionEnd"
    

    for (t in transitions)
        if (el.style[t] !== undefined)
            return transitions[t];
        
    

var customTransitionEnd = whichTransitionEvent();

// Get button
var btns = document.querySelectorAll('img.btn:active'),
    i;

for (i = 0; i < btns.length; ++i) 
    btns[i].addEventListener(customTransitionEnd, function(e) 
        e.preventDefault();
        alert('Transition End');
        // window.close();
    );

【讨论】:

【参考方案2】:

实现这一点的最简单方法是在用户单击锚点或图像时使用Element.classList API 添加一个类,然后在该给定类上添加EventTarget.addEventListener。

function closeWindow () 
    alert("actice: transition end you can call window.close() now");
    window.close();

function anchorActive (e) 
    e.preventDefault();
    imgButton.classList.add("active")


  var clickAnchor = document.querySelector("#clickAnchor"),
      imgButton = document.querySelector("img.button");

  clickAnchor.addEventListener("click", anchorActive, false);
  imgButton.addEventListener("transitionend", closeWindow, false);
img
  opacity: 1; 
  transition: opacity 3s ease

img.activeopacity: .3
&lt;a id=clickAnchor href="#"&gt;&lt;img class="button" src="http://placehold.it/150x150.png"&gt;&lt;/a&gt;

【讨论】:

以上是关于如何使用 addEventListener(webkitTransitionEnd) 在 window.close() 之前延迟?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .addEventListener 打印出数组的特定项?

如何使用addEventListener添加事件

如何在游戏循环中使用 addEventListener

如何使用 addEventListener(webkitTransitionEnd) 在 window.close() 之前延迟?

Service-Worker addEventListener,如何使用事件参数?

Angular mobileQuery.addEventListener 不是 safari 中的函数,如何修复?