javascript - 火狐浏览器下阻止drop事件的默认行为

查看:172
本文介绍了javascript - 火狐浏览器下阻止drop事件的默认行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
    body,ul,li{margin:0;padding:0;}
    ul{
        margin:30px;
    }
    .clearfix{
        *zoom=1;
    }
    .clearfix:after{
        content:'';
        clear:both;
        display:block;
    }
    li{
        float:left;
        width:200px;
        height:300px;
        list-style:none;
        margin-right:30px;
    }
    li img{
        width:200px;
        height:200px;
    }
    #shopCar{
        width:600px;
        min-height:300px;
        margin-top:50px;
        margin-left:20px;
        border:1px solid #333;
    }
    .box{
        width:200px;
        float:left;
    }
    #allMoney,.box3{
        text-align:right;
    }
    p{
        border-bottom:1px dashed #ccc;
    }
</style>
</head>

<body>
    <ul class="clearfix">
        <li draggalbe="true">
            <img src="img1.jpg" />
            <p>javascript语言精粹</p>
            <p>40¥</p>
        </li>
        <li>
            <img src="img2.jpg" />
            <p>javascript权威指南</p>
            <p>120¥</p>
        </li>
        <li draggable="true">
            <img src="img3.jpg" />
            <p>精通javascript</p>
            <p>35¥</p>
        </li>
        <li draggable="true">
            <img src="img4.jpg" />
            <p>DOM编程艺术</p>
            <p>45¥</p>
        </li>
    </ul>
    <div id="shopCar">
        <!--<p class="clearfix">
            <span class="box box1">1</span>
            <span class="box box2">DOM编程艺术</span>
            <span class="box box3">45¥</span>
        </p>-->
        <div id="allMoney">总价:<span>0</span>¥</div>
    </div>
</body>
<script>
    var aLi=document.getElementsByTagName("li");
    var shopCar=document.getElementById("shopCar");
    var allMoney=document.getElementById("allMoney").getElementsByTagName("span")[0];
    
    for (var i=0;i<aLi.length;i++){
        aLi[i].ondragstart=function(ev){
            var ev=ev||window.event;
            var aP=this.getElementsByTagName("p");
            ev.dataTransfer.setDragImage(this,0,0);
            ev.dataTransfer.setData("name",aP[0].innerText);
            ev.dataTransfer.setData("price",aP[1].innerText);
        }
    }
    
    
    shopCar.ondragenter=function(){
        this.style.borderColor="red";
    }
    shopCar.ondragover=function(ev){
        var ev=ev||window.event;
        ev.preventDefault();
    }
    shopCar.ondragleave=function(){
        this.style.borderColor="#333";    
    }
    shopCar.ondrop=function(ev){
        var ev=ev||window.event;
        ev.preventDefault();
        ev.returnValue=false;
        var name=ev.dataTransfer.getData("name");
        var price=ev.dataTransfer.getData("price");
        var oP=document.createElement("p");
        oP.className="clearfix";
        var str="<span class='box box1'>1</span><span class='box box2'>"+name+"</span>"+price+"<span class='box box3'></span>";
        oP.innerHTML=str;
        this.insertBefore(oP,this.children[0]);
        allMoney.innerHTML=parseFloat(allMoney.innerHTML)+parseFloat(price)+'';
    }
</script>
</html>

已经用ev.preventDefault()了,但拖放图片还是会新窗口打开图片。为什么呢?

解决方案

发现加了句 ev.stopPropagation() 就可以了,应该是火狐的冒泡和捕获的事件触发顺序问题。

shopCar.ondrop=function(ev){
        var ev=ev||window.event;
        ev.preventDefault();
        
        ev.stopPropagation();
        
        ev.returnValue=false;
        var name=ev.dataTransfer.getData("name");
        var price=ev.dataTransfer.getData("price");
        var oP=document.createElement("p");
        oP.className="clearfix";
        var str="<span class='box box1'>1</span><span class='box box2'>"+name+"</span>"+price+"<span class='box box3'></span>";
        oP.innerHTML=str;
        this.insertBefore(oP,this.children[0]);
        allMoney.innerHTML=parseFloat(allMoney.innerHTML)+parseFloat(price)+'';
    }

这篇关于javascript - 火狐浏览器下阻止drop事件的默认行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆