uni-app icon indicating copy to clipboard operation
uni-app copied to clipboard

快手小程序事件报错n.forEach is not a function

Open jusong-cmd opened this issue 1 year ago • 1 comments
trafficstars

小程序编译后的JS vender.js rget,e.detail)),e}(e);var r=(e.currentTarget||e.target).dataset;if(!r)return console.warn("事件信息不存在");var n=r.eventOpts||r["event-opts"];if(!n)return console.warn("事件信息不存在");var i=e.type,o=[];return n.forEach((function(r){var n=r[0],a=r[1],c="^"===n.charAt(0);n=c?n.slice(1):n;var u="~"===n.charAt(0);n=u?n.slice(1):n,a&&function(e,t){return e===t||"regionchange"===t&&("begin"===e||"end"===e)}

未混淆的代码 vender.js `function handleEvent(event) { var _this3 = this; event = wrapper$1(event);

// [['tap',[['handle',[1,2,a]],['handle1',[1,2,a]]]]] var dataset = (event.currentTarget || event.target).dataset; if (!dataset) { return console.warn('事件信息不存在'); } var eventOpts = dataset.eventOpts || dataset['event-opts']; // 支付宝 web-view 组件 dataset 非驼峰 if (!eventOpts) { return console.warn('事件信息不存在'); }

// [['handle',[1,2,a]],['handle1',[1,2,a]]] var eventType = event.type; var ret = []; eventOpts.forEach(function (eventOpt) { var type = eventOpt[0]; var eventsArray = eventOpt[1]; var isCustom = type.charAt(0) === CUSTOM; type = isCustom ? type.slice(1) : type; var isOnce = type.charAt(0) === ONCE; type = isOnce ? type.slice(1) : type; if (eventsArray && isMatchEventType(eventType, type)) { eventsArray.forEach(function (eventArray) { var methodName = eventArray[0]; if (methodName) { var handlerCtx = _this3.$vm; if (handlerCtx.$options.generic) { // mp-weixin,mp-toutiao 抽象节点模拟 scoped slots handlerCtx = getContextVm(handlerCtx) || handlerCtx; } if (methodName === '$emit') { handlerCtx.$emit.apply(handlerCtx, processEventArgs(_this3.$vm, event, eventArray[1], eventArray[2], isCustom, methodName)); return; } var handler = handlerCtx[methodName]; if (!isFn(handler)) { var _type = _this3.$vm.mpType === 'page' ? 'Page' : 'Component'; var path = _this3.route || _this3.is; throw new Error("".concat(_type, " "").concat(path, "" does not have a method "").concat(methodName, """)); } if (isOnce) { if (handler.once) { return; } handler.once = true; } var params = processEventArgs(_this3.$vm, event, eventArray[1], eventArray[2], isCustom, methodName); params = Array.isArray(params) ? params : []; // 参数尾部增加原始事件对象用于复杂表达式内获取额外数据 if (/=\s*\S+.eventParams\s*||\s*\S+[['"]event-params['"]]/.test(handler.toString())) { // eslint-disable-next-line no-sparse-arrays params = params.concat([,,,,,,,,,, event]); } ret.push(handler.apply(handlerCtx, params)); } }); } }); if (eventType === 'input' && ret.length === 1 && typeof ret[0] !== 'undefined') { return ret[0]; } }` eventOpts 存在但不为数组,核心库里需要兼容一下eventOpts不为数组,每次编译后处理很麻烦

jusong-cmd avatar Aug 27 '24 03:08 jusong-cmd

这个是vender.js核心库,在快手正式版小程序中复现概率很大,也给快手开发反馈了 在快手小程序中特定概率eventOpts 存在但不为数组,核心库里需要兼容一下eventOpts不为数组 该问题不影响使用,但在小程序后台显示一堆异常 下面是核心库源码

function handleEvent(event) {
  var _this3 = this;
  event = wrapper$1(event);

  // [['tap',[['handle',[1,2,a]],['handle1',[1,2,a]]]]]
  var dataset = (event.currentTarget || event.target).dataset;
  if (!dataset) {
    return console.warn('事件信息不存在');
  }
  var eventOpts = dataset.eventOpts || dataset['event-opts']; // 支付宝 web-view 组件 dataset 非驼峰
  if (!eventOpts) {
    return console.warn('事件信息不存在');
  }

  // [['handle',[1,2,a]],['handle1',[1,2,a]]]
  var eventType = event.type;
  var ret = [];
  eventOpts.forEach(function (eventOpt) {
    var type = eventOpt[0];
    var eventsArray = eventOpt[1];
    var isCustom = type.charAt(0) === CUSTOM;
    type = isCustom ? type.slice(1) : type;
    var isOnce = type.charAt(0) === ONCE;
    type = isOnce ? type.slice(1) : type;
    if (eventsArray && isMatchEventType(eventType, type)) {
      eventsArray.forEach(function (eventArray) {
        var methodName = eventArray[0];
        if (methodName) {
          var handlerCtx = _this3.$vm;
          if (handlerCtx.$options.generic) {
            // mp-weixin,mp-toutiao 抽象节点模拟 scoped slots
            handlerCtx = getContextVm(handlerCtx) || handlerCtx;
          }
          if (methodName === '$emit') {
            handlerCtx.$emit.apply(handlerCtx, processEventArgs(_this3.$vm, event, eventArray[1], eventArray[2], isCustom, methodName));
            return;
          }
          var handler = handlerCtx[methodName];
          if (!isFn(handler)) {
            var _type = _this3.$vm.mpType === 'page' ? 'Page' : 'Component';
            var path = _this3.route || _this3.is;
            throw new Error("".concat(_type, " \"").concat(path, "\" does not have a method \"").concat(methodName, "\""));
          }
          if (isOnce) {
            if (handler.once) {
              return;
            }
            handler.once = true;
          }
          var params = processEventArgs(_this3.$vm, event, eventArray[1], eventArray[2], isCustom, methodName);
          params = Array.isArray(params) ? params : [];
          // 参数尾部增加原始事件对象用于复杂表达式内获取额外数据
          if (/=\s*\S+\.eventParams\s*\|\|\s*\S+\[['"]event-params['"]\]/.test(handler.toString())) {
            // eslint-disable-next-line no-sparse-arrays
            params = params.concat([,,,,,,,,,, event]);
          }
          ret.push(handler.apply(handlerCtx, params));
        }
      });
    }
  });
  if (eventType === 'input' && ret.length === 1 && typeof ret[0] !== 'undefined') {
    return ret[0];
  }
}

快手小程序编译后报错

错误信息:

n.forEach is not a function

错误路径:

common/vendor.js

错误代码:

rget,e.detail)),e}(e);var r=(e.currentTarget||e.target).dataset;if(!r)return console.warn("事件信息不存在");var n=r.eventOpts||r["event-opts"];if(!n)return console.warn("事件信息不存在");var i=e.type,o=[];return n.forEach((function(r){var n=r[0],a=r[1],c="^"===n.charAt(0);n=c?n.slice(1):n;var u="~"===n.charAt(0);n=u?n.slice(1):n,a&&function(e,t){return e===t||"regionchange"===t&&("begin"===e||"end"===e)}

核心库兼容一下,这样可以兼容一下快手小程序的问题

 if (!eventOpts||!Array.isArray(eventOpts)) {
    return console.warn('事件信息不存在');
  }

jusong-cmd avatar Aug 28 '24 03:08 jusong-cmd

hello , 能够提供一下,你是如何发现的这个问题吗?您光提供 vendor.js 的修改,我们也不好判断是否会产生其它问题

GRCmade avatar Mar 11 '25 09:03 GRCmade

提供一下一个原始的可以复现的 uniapp 项目

GRCmade avatar Mar 12 '25 09:03 GRCmade