Javascript 由于目标被视为被动事件,无法在被动事件侦听器中防止默认值

Javascript 由于目标被视为被动事件,无法在被动事件侦听器中防止默认值,javascript,html,Javascript,Html,由于目标被视为被动对象,我收到此错误无法防止默认内部被动事件侦听器。在Chrome mobile browser中,当我尝试单击受下面粘贴的onepageascroll代码影响的区域内的链接时 该代码在桌面/全浏览器大小下运行良好,我可以单击链接 一旦在手机上查看站点,链接就变得不可访问 我搜索了错误,发现它与告诉preventDefault不要被动有关,因此我添加了e.preventDefault(),{passive:false}到//绑定触摸线下的触摸事件 这使链接再次可点击,但破坏了on

由于目标被视为被动对象,我收到此错误
无法防止默认内部被动事件侦听器。
在Chrome mobile browser中,当我尝试单击受下面粘贴的onepageascroll代码影响的区域内的链接时

该代码在桌面/全浏览器大小下运行良好,我可以单击链接

一旦在手机上查看站点,链接就变得不可访问

我搜索了错误,发现它与告诉preventDefault不要被动有关,因此我添加了
e.preventDefault(),{passive:false}到//绑定触摸线下的触摸事件

这使链接再次可点击,但破坏了onepage滚动功能,因此页面不再移动

所以我猜我需要知道的是如何将“点击”和“滚动”分开

包含了我一直在使用的js代码

 * onepagescroll.js v1.0.0
 * Athuor : Mystika
 * Fork this script on github https://github.com/mystika/onepagescroll
 * http://mystika.me

function onepagescroll(selector, options) {
    var pages = [];
    var currentPage = 1;
    var isPageChanging = false;
    var keyUp = {38:1,33:1};
    var keyDown = {40:1,34:1};
    
    var def = {
        pageContainer: 'li',
        animationType: 'ease-in-out',
        animationTime: 500,
        infinite: true,
        pagination: true,
        keyboard: true,
        direction: 'vertical',
    };

    var setting = extend({},def,options);

    /* initialization */
    function init(){

        window.addEventListener('wheel',onScrollEventHandler);

        css(document.querySelector(selector),{
            transition: 'transform ' + setting.animationTime + 'ms ' + setting.animationType
        });
        
        //allow keyboard input
        if(setting.keyboard){
            addEventListener('keydown', function(e){
                if(keyUp[e.keyCode])
                    changePage(1,pages.length,-1);
                else if(keyDown[e.keyCode])
                    changePage(pages.length,1,1);
            });
        }

        document.querySelector(selector).classList.add('ops-container');
        
        detectTransitionEnd() && document.querySelector(selector).addEventListener(detectTransitionEnd(), function(){
            isPageChanging = false;
        });

        var bullet_list_container = null;
        /* create navigation bullets */
        if(setting.pagination){
            bullet_list_container = document.createElement("ul");
            bullet_list_container.classList.add('ops-navigation');
        }
        
        var index=1;
        [].forEach.call(document.querySelectorAll(selector + ' > ' + setting.pageContainer), function(obj){
            if(setting.pagination){
                var bullet_list = document.createElement('li');
                var bullet = document.createElement('a');
                bullet.setAttribute('data-targetindex',index);
                bullet.href='#';
                bullet_list.appendChild(bullet);
                bullet_list_container.appendChild(bullet_list); 
            }

            obj.classList.add('ops-page');
            
            if(setting.direction == 'horizontal'){
                css(obj,{
                    left:(index-1)*100 + '%',
                    position:'absolute'
                });
            }

            pages.push(obj);
            obj.setAttribute('data-pageindex',index++);
        });

        if(setting.pagination){
            document.body.appendChild(bullet_list_container);
            document.querySelector('a[data-targetindex="' + currentPage +'"]').classList.add('active');
        }

        
    }

    /* wheel event handler */
    function onScrollEventHandler(e){
        if(e.wheelDelta > 0)
            changePage(1,pages.length,-1);
        else
            changePage(pages.length,1,1);
    }

    /* dected transitions completion for block duplicated scrolling */
    function detectTransitionEnd(){
        var t;
        var 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];
        return true;
    }


    /* css setter */
    function css(obj,styles){
        for (var _style in styles)
            if(obj.style[_style] !== undefined)
                obj.style[_style] = styles[_style];
        
    }

    /* extend function for user customization */
    function extend(){
        for(var i=1; i<arguments.length; i++)
            for(var key in arguments[i])
                if(arguments[i].hasOwnProperty(key))
                    arguments[0][key] = arguments[i][key];
        return arguments[0];
    }

    //function for page transition
    function changePage(compare,edge,increase){
        if(isPageChanging) return;

        if(currentPage==compare){
            if(setting.infinite)
                currentPage = edge;
            else
                return;
        }
        else{
            currentPage+=increase;
        }

        if(setting.animationTime) isPageChanging = true;
    
        if(setting.pagination){
            document.querySelector('a.active[data-targetindex]').classList.remove('active');
            document.querySelector('a[data-targetindex="' + currentPage +'"]').classList.add('active');
        }
        if(setting.direction == 'vertical'){
            css(document.querySelector(selector),{
                transform:'translate3d(0,' + -(currentPage-1)*100 + '%,0)'
            });
        }
        else if(setting.direction == 'horizontal'){
            css(document.querySelector(selector),{
                transform:'translate3d(' + -(currentPage-1)*100 + '%,0,0)'
            }); 
        }
    }

    /* swipe */
    var fpos = 0;
    var lpos = 0;
    var _n = 90;

    //bind touch
    document.addEventListener('touchstart', function(e) {
        e.preventDefault();
        if (e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel') {
        var touch = e.touches[0] || e.changedTouches[0];
            if(setting.direction == 'vertical')
                fpos = touch.pageY;
            else if(setting.direction == 'horizontal')
                fpos = touch.pageX;
        }
    });
    

    document.addEventListener('touchend', function(e) {
        e.preventDefault();

        if (e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel') {
            var touch = e.touches[0] || e.changedTouches[0];
            if(setting.direction == 'vertical')
                lpos = touch.pageY;
            else if(setting.direction == 'horizontal')
                lpos = touch.pageX;
        }
        if(fpos + _n < lpos)
            changePage(1,pages.length,-1);
        else if(fpos > lpos + _n)
            changePage(pages.length,1,1);
    });


    /* check documents ready statement and do init() */
    if(document.readyState === 'complete')
        init();
    else
        window.addEventListener('onload', init(), false);
    
}
*onepagescroll.js v1.0.0
*雅典人:迈斯蒂卡
*在github上生成此脚本https://github.com/mystika/onepagescroll
* http://mystika.me
功能onepagescroll(选择器、选项){
var页面=[];
var currentPage=1;
var IsPageChangeing=false;
var-keyUp={38:1,33:1};
var-keyDown={40:1,34:1};
变量定义={
pageContainer:'li',
animationType:“缓进缓出”,
动画时间:500,
无限:是的,
分页:正确,
键盘:没错,
方向:'垂直',
};
var设置=扩展({},def,options);
/*初始化*/
函数init(){
窗口。addEventListener(“轮子”,位于CrolleEventHandler上);
css(文档查询选择器(选择器){
转换:“transform”+setting.animationTime+“ms”+setting.animationType
});
//允许键盘输入
如果(设置键盘){
addEventListener('keydown',函数(e){
if(键控[e.keyCode])
更改页面(1,页面长度,-1);
else if(键下[e.keyCode])
变更页(页长,1,1);
});
}
document.querySelector(选择器).classList.add('ops-container');
detectTransitionEnd()和&document.querySelector(选择器).addEventListener(detectTransitionEnd(),函数(){
isPageChanging=false;
});
var bullet\u list\u container=null;
/*创建导航项目符号*/
if(设置分页){
bullet_list_container=document.createElement(“ul”);
bullet_list_container.classList.add('ops-navigation');
}
var指数=1;
[].forEach.call(document.querySelectorAll(selector+'>'+setting.pageContainer),函数(obj){
if(设置分页){
var bullet_list=document.createElement('li');
var bullet=document.createElement('a');
bullet.setAttribute('data-targetindex',index);
bullet.href='#';
项目符号列表。追加子项(项目符号);
bullet\u list\u container.appendChild(bullet\u list);
}
obj.classList.add('ops-page');
如果(setting.direction==“水平”){
css(obj{
左:(指数-1)*100+'%',
位置:'绝对'
});
}
页面推送(obj);
obj.setAttribute('data-pageindex',index++);
});
if(设置分页){
document.body.appendChild(bullet\u list\u容器);
document.querySelector('a[data targetindex=“”+currentPage+“]”).classList.add('active');
}
}
/*控制盘事件处理程序*/
Crolleventhandler(e)上的函数{
如果(e.车轮三角洲>0)
更改页面(1,页面长度,-1);
其他的
变更页(页长,1,1);
}
/*块重复滚动的dected转换完成*/
函数detectTransitionEnd(){
变量t;
var el=document.createElement('fakeelement');
变量转换={
“transition”:“transitionend”,
“OTransition”:“oTransitionEnd”,
'MozTransition':'transitionend',
“WebKittTransition”:“WebKittTransitionEnd”
}
for(t在过渡中)
如果(el.style[t]!==未定义)
返回转换[t];
返回true;
}
/*css设置器*/
功能css(对象、样式){
for(样式中的var\u样式)
if(对象样式[_样式]!==未定义)
对象样式[_样式]=样式[_样式];
}
/*扩展用户定制功能*/
函数extend(){
对于(var i=1;i lpos+_n)
变更页(页长,1,1);
});
/*检查文档就绪语句并执行初始化()*/
如果(document.readyState==='complete')
init();
其他的
addEventListener('onload',init(),false);
}

添加事件侦听器时需要执行
{passive:true}
。编辑,我看不到在代码postedI中的任何地方有这样的文档。addEventListener('touchstart',函数(e){e.preventDefault(),{passive:true};
但是这阻止了滚动是的,这就是“被动”的全部意义通过使用它,您告诉浏览器您的事件处理程序将允许默认操作继续;换句话说,您不需要
.preventDefault()
。谢谢,这是我不明白的一点,我该如何保持滚动?同时允许点击通过?我也不明白为什么这个问题只会影响我的手机浏览……我想我只需要点击来保持“允许默认”的状态