【问题标题】:SPFX 1.7.1 webpart is not working on IE11SPFX 1.7.1 webpart 不适用于 IE11
【发布时间】:2019-06-22 10:59:15
【问题描述】:

我创建了一个新的 SharePoint Web 部件(版本 1.7.1)。我正在使用反应模板。 Web 部件非常基础,但不能在 IE 11 上运行。

返回的错误是 对象不支持属性或方法'find'

我没有在我的任何 .ts 文件中使用 find,所以我发现 .find 方法正在被从我的 .ts 文件转译的 .js 文件调用。

有人可以确认这是 SPFX v1.7.1 中的错误吗? 如果有,有没有解决办法。

我知道这可以通过引入垫片来解决,但我不知道如何为 SPFX 配置它,也找不到任何说明如何执行此操作的文档。

欢迎任何帮助。

【问题讨论】:

    标签: internet-explorer-11 spfx


    【解决方案1】:

    如果我没记错的话,这是因为 IE 11 不支持 React 引擎使用的Element.closest

    我个人使用element-closest 来填充它,尽管我确信还有其他选择。

    // beginning of WebPart code file
    import 'element-closest/browser';
    
    import * as React from 'react';
    import * as ReactDom from 'react-dom';
    // rest of the code, etc.
    

    【讨论】:

    • 嗨理查德,这对我不起作用...我已经使用 npm install element-closest 添加了多边形填充,然后在所有具有 import * as React 的 TS 文件上添加了导入。我仍然有错误。 tslint 还抱怨这个“找不到模块元素最近/浏览器的声明文件......”
    • 很高兴看到它被另一个答案解决了。在阅读了吕志的回答后,我意识到这个Element.closest 问题可能不相关,尽管我之前肯定不得不为我的 SPFx 解决方案填充它。回答你的后续问题:是的,那是因为没有随这个包安装 TypeScript 类型 - 它仍然会正确填充,你可以忽略 TSLint 投诉。
    • 不幸的是它没有解决问题...不是 jquery 造成的...
    • 在从我的代码中删除更多包之后,我终于找到了罪魁祸首,那就是“react-if”包……有人有解决这个问题的经验吗?
    • 我最终完全删除了该包并使用“标准”反应方式来完成部分渲染
    【解决方案2】:

    参考this article,可以看到Array.prototype.find()方法不支持IE浏览器。但是,此方法已添加到 ECMAScript 2015 规范中,可能尚未在所有 JavaScript 实现中可用。但是,您可以使用以下 sn-p 填充 Array.prototype.find:

    // https://tc39.github.io/ecma262/#sec-array.prototype.find
    if (!Array.prototype.find) {
      Object.defineProperty(Array.prototype, 'find', {
        value: function(predicate) {
         // 1. Let O be ? ToObject(this value).
          if (this == null) {
            throw new TypeError('"this" is null or not defined');
          }
    
          var o = Object(this);
    
          // 2. Let len be ? ToLength(? Get(O, "length")).
          var len = o.length >>> 0;
    
          // 3. If IsCallable(predicate) is false, throw a TypeError exception.
          if (typeof predicate !== 'function') {
            throw new TypeError('predicate must be a function');
          }
    
          // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
          var thisArg = arguments[1];
    
          // 5. Let k be 0.
          var k = 0;
    
          // 6. Repeat, while k < len
          while (k < len) {
            // a. Let Pk be ! ToString(k).
            // b. Let kValue be ? Get(O, Pk).
            // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
            // d. If testResult is true, return kValue.
            var kValue = o[k];
            if (predicate.call(thisArg, kValue, k, o)) {
              return kValue;
            }
            // e. Increase k by 1.
            k++;
          }
    
          // 7. Return undefined.
          return undefined;
        },
        configurable: true,
        writable: true
      });
    }
    

    另外,据我所知,当我们使用React时,默认生成的react项目支持所有现代浏览器。对 Internet Explorer 9、10 和 11 的支持需要 polyfills。你可以检查它并导入相关的包。

    【讨论】:

    • 吕志,我知道 polyfill 可以解决这个问题...问题是...如何将 polyfills 包含到 SPFX 中?这部分的一些指导将是一个好主意......您甚至可能想知道为什么 MS 在他们自己的技术 (SharePoint) 中不再支持他们自己的适当浏览器。真是令人沮丧!!!!
    • 经过一番调查,似乎问题出在将 JQUERY 包含到项目中。带有 REACT 的股票项目确实在 IE 上运行。抱歉吐槽了!
    • 所以我删除了 jquery 仍然有问题......那么你如何使用这个 polyfill?
    • 您应该可以将代码 sn-p 粘贴到 WebPart.ts 文件的开头。每当 Web 部件中的其他代码调用它时,它将实现 Array.find() 方法,包括通过依赖于使用 Array.find 的任何导入。
    【解决方案3】:

    您可以调整您的 tsconfig.json 文件:在“compilerOptions”下将“target”设置为“es5”。 Typescript 将为您创建 polyfill。

    【讨论】:

      【解决方案4】:

      我有同样的问题。在您的 webpart.ts 文件中使用此导入。

      import 'core-js/modules/es6.array.find';
      

      【讨论】:

      • 谢谢,但这并不能解决我的问题。
      猜你喜欢
      • 2023-03-06
      • 2020-12-13
      • 2021-07-18
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多