CSS转换不会触发onb​​eforeunload

时间:2014-04-24 15:59:37

标签: javascript css css3 css-transitions onbeforeunload

我有一个坚定的客户,他希望在她的网站上卸载每个页面时进行大量的CSS转换。

这个小提琴符合预期的延迟,缓和和持续时间:http://jsfiddle.net/kLW4C/

但是,当我尝试在此处实现完全相同的(我认为)代码时:http://nolaflash.com/transition.html不会发生转换。

页码如下。为什么它在小提琴中起作用而不在页面中?

<!doctype html>
<html>
<head>
<meta charset="utf-8">

<script type="text/javascript">//<![CDATA[ 
    window.onload=function(){
        window.onbeforeunload = function (e) {
            document.getElementById('myLink').className = 'out';
        }
    }//]]>
</script>

<style type="text/css">
#myLink {
    display:block;
    padding:20px;
    background:#CCC;
    transition-property: background color;
    transition-duration: 12.5s;
    transition-timing-function: ease;
    transition-delay: 6.5s;
}
#myLink.out {
    background:#CC0000;
}
</style>
</head>

<body id="bod" class='in'>

<a href='https://www.google.com' id='myLink'>click me and watch me go red before the page unloads</a>

</body>
</html>

3 个答案:

答案 0 :(得分:2)

beforeunload 应该用于提示。

根据规范,如果要卸载页面 ,则“salvageable”标志设置为FALSE,这可能是阻止您转换的原因。

请参阅:http://dev.w3.org/html5/spec-LC/history.html#unloading-documents

答案 1 :(得分:1)

您可以通过阻止所有链接行为直到页面转换结束,然后前进到下一页来完成此操作。虽然我和你在一起,但我不一定会推荐这种行为。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<style>
    body {
        transition: 5s; 
   }
    .red {
         background: red;   
    }
</style>

</head>

<body>
<a href="http://www.google.com">test</a>
<script>
var pageTransition=function(){
     // save url for later   
    var nextLink;
    var links=document.querySelectorAll('a');
    var body=document.querySelector('body');

    // I was transitioning the body, you'll need browser-specific listeners
    body.addEventListener('transitionend', function(e){
        // navigate to next page after transition
        window.location=nextLink;
    });
    // disable all links, save url for later
     for(i=0; i<links.length; i++){
         links[i].addEventListener('click', function(e){
            nextLink=e.target.href;
            body.className+=" red";
            e.preventDefault();
         });
     }
}();

</script>
</body>
</html>

答案 2 :(得分:1)

您的问题有一个解决方法。以下代码适用于单个锚点。类似地,您可以使用jquery将事件绑定到同一页面上的所有锚点。

<!doctype html>
<html>
<head>
<meta charset="utf-8">

<style type="text/css">
#myLink {
    display:block;
    padding:20px;
    background:#CCC;
    transition-property: background color;
    transition-duration: 4.5s;
    transition-timing-function: ease;
    transition-delay: 1.5s;
}
#myLink.out {
    background:#CC0000;
}
</style>
</head>
<script>
function makeDelay(obj){

setTimeout(function(){
     window.location.href = obj.href;
},5000);

document.getElementById('myLink').className = 'out';
    return false;
}
</script>
<body id="bod" class='in'>

<a href='http://www.bing.com' id='myLink' onClick="makeDelay(this);return false;">click me and watch me go red before the page unloads</a>

</body>
</html>