请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

rendition绑定事件的时候报错

Unable to preventDefault inside passive event listener due to target being treated as passive.

正在回答

2回答

Sam 2019-01-20 21:04:48

回复 核桃夹过的门:造成这个问题的主要原因是事件将passive属性设置为true,但这个是由epubjs完成的,我们无法进行修改,这里以touchstart举例,说明Rendition事件绑定的大致流程:

1、通过EventEmitter进行Rendition原型链扩展,添加on方法

EventEmitter(Rendition.prototype);

2、用户调用Rendition.on()方法绑定事件,该方法来源于event-emitter库,该方法接收两个参数:type和listener,前者是事件类型,后者是事件回调方法,on方法会在Rendition对象上扩展一个__ee__属性,我们的type和listener会以k-v形式保存在__ee__对象上:

on = function (type, listener) {
 var data;
 callable(listener);
 if (!hasOwnProperty.call(this, '__ee__')) {
  data = descriptor.value = create(null);
  defineProperty(this, '__ee__', descriptor);
  descriptor.value = null;
 } else {
  data = this.__ee__;
 }
 if (!data[type]) data[type] = listener;
 else if (typeof data[type] === 'object') data[type].push(listener);
 else data[type] = [data[type], listener];
 return this;
};

3、在iframe界面中添加touchstart事件,在managers/views/iframe.js下绑定touchstart事件:

h.element.addEventListener("touchstart", emitter);

4、事件触发时,会调用emitter方法,该方法会调用根据事件类型,到__ee__上找到对应的方法,并进行执行,实际调用的是event-emitter库中的emit方法

emit = function (type) {
  // ...
}

通过上述分析我们可以看到,我们无法对passive属性进行修改,所以无法使用event.preventDefault()

0 回复 有任何疑惑可以回复我~
Sam 2019-01-20 19:57:48

你好,将event.preventDefault()注释即可

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信