Javascript preventDefault operation

Javascript preventDefault operation

本文关键字:operation preventDefault Javascript      更新时间:2024-04-03

我只是在练习一些JavaScript,遇到了一个无法回避的错误。我在html中有一个列表,每个项目都链接到一个页面,但是我在js脚本中有一个函数,当我点击该项时,它会将该项从列表中删除,我试图使用preventDefault(),但它仍然会将我带到该链接。

<ul id="shoppingList">
        <li class="complete"><a href="google.com><em>fresh</em>tuna</a></li>
        <li class="complete"><a href="google.com">meatball</a></li>
        <li class="complete"><a href="google.com">kiwi</a></li>
        <li class="complete"><a href="google.com">chicken soup</a></li>
    </ul> 
function getTarget(e){
if(!e){
    e = window.event;
} 
return e.target || e.srcElement;}
function itemDone(e){
//Remove item from the list
var target;
var Parent;
var Grandparent;
target = getTarget(e);
Parent = target.parentNode;
Grandparent = target.parentNode.parentNode;
Grandparent.removeChild(Parent);
//Prevent the link from taking you somewhere
if(e.preventDefault){
    e.preventDefault();
}else{
    e.returnValue = false;
}
}
//Set up event listeners to call ItemDone() on click
var Shoppo = document.getElementById('shoppingList');
if(Shoppo.addEventListener){
Shoppo.addEventListener('click',function(e){
    itemDone(e);
},flase);
}else{
Shoppo.attachEvent('onClick',function(e){
    itemDone(e);
});
}

要检查是否调用了e.preventDefault(),可以使用返回true或false的isDefaultPrevented。所以你可以这样修改你的代码,

e.preventDefault();
if(e.isDefaultPrevented()){
    // default event is prevented
}else{
    e.returnValue = false;
}

更改此项:

if(e.preventDefault){
    e.preventDefault();
}else{
    e.returnValue = false;
}

到此:

e.preventDefault();
return false;

这将起作用,并为您节省几行代码。

如果您不希望浏览器跟随链接,但仍然需要url,可以将其存储在不同的属性中,并将href设置为#。

<a href="#" id="link1" destinationurl="www.google.com" ... />

然后您可以使用getAttribute函数来检索值

document.getElementById("link1").getAttribute("destinationurl");

我发现自己处于这种情况,

ev.preventDefault();
ev.stopPropagation();

甚至

document.onclick= function(ev){ev.preventDefault(); ev.stopPropagation(); return false;}

根本没有帮助

正如我使用touchstart、touchend和touchmove创建mousedown、onmouseup和mousemove事件一样。

在桌面上,没有问题,但在手机上使用相同的代码,控制台中的所有内容都会翻倍(有时在同一个电话上???)。

我可以用这个代码解决问题:

var clickUpMouseEventTimer = 0; 
function clickUp(ev) {
   ev = ev || event;
   console.log('clickUp mouse timer' ,ev['timeStamp'], ev['timeStamp'] -clickUpMouseEventTimer)
   if( clickUpMouseEventTimer + 200 < ev['timeStamp']) {
       clickUpMouseEventTimer = ev['timeStamp'];
   } else {
       return;
   }

通过这种方式,我可以拦截任何mousedown或mouseup事件,如果通过测量加倍发射:

ev['timeStamp'],

并通过提供200ms的延迟(这取决于程序执行时间)来决定是放弃输入还是让它通过函数。

魔术效果最好,台式机和移动设备现在正在做完全相同的步骤(除了触摸到鼠标的事件转换器)。

希望它能有所帮助,因为你们用你们的经验和知识帮助了我很多次。