对象不支持“startsWith”属性或方法

本文介绍了解决360浏览器中不支持startsWith方法的问题,通过使用babel-polyfill和自定义polyfill实现了功能兼容。

 

项目兼容性问题

开发环境

  • 360浏览器
  • vue "^2.5.17"
  • vue-cli3

问题

对象不支持“startsWith”属性或方法
startsWith()方法用来判断当前字符串是否是以另外一个给定的子字符串“开头”的,根据判断结果返回 true 或 false。
查阅MDN,发现ie根本就不支持,因此使用ie内核的360浏览器必然也不支持

解决方案

这个是es6字符串的一个方法,但是ie不支持,因此只能使用babel-polyfill,这个是对这些不支持方法的实现,解决方法如下:

  • npm install babel-polyfill -S
  • import 'babel-polyfill' --- 在index.js中引入

新问题 在360上很奇怪,有的页面还会报这个错 然后我就把MDN的的polyfill给引过来了

  • 新建一个polyfill.js,代码如下
if (!String.prototype.startsWith) {
  (function() {
    'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
    var defineProperty = (function() {
      // IE 8 only supports `Object.defineProperty` on DOM elements
      try {
        var object = {};
        var $defineProperty = Object.defineProperty;
        var result = $defineProperty(object, object, object) && $defineProperty;
      } catch(error) {}
      return result;
    }());
    var toString = {}.toString;
    var startsWith = function(search) {
      if (this == null) {
        throw TypeError();
      }
      var string = String(this);
      if (search && toString.call(search) == '[object RegExp]') {
        throw TypeError();
      }
      var stringLength = string.length;
      var searchString = String(search);
      var searchLength = searchString.length;
      var position = arguments.length > 1 ? arguments[1] : undefined;
      // `ToInteger`
      var pos = position ? Number(position) : 0;
      if (pos != pos) { // better `isNaN`
        pos = 0;
      }
      var start = Math.min(Math.max(pos, 0), stringLength);
      // Avoid the `indexOf` call if no match is possible
      if (searchLength + start > stringLength) {
        return false;
      }
      var index = -1;
      while (++index < searchLength) {
        if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {
          return false;
        }
      }
      return true;
    };
    if (defineProperty) {
      defineProperty(String.prototype, 'startsWith', {
        'value': startsWith,
        'configurable': true,
        'writable': true
      });
    } else {
      String.prototype.startsWith = startsWith;
    }
  }());
}

然后再main.js引入这个js

import './util/polyfill'
 
### IE8浏览器中“对象不支持属性方法”报错问题的解决方案 在IE8浏览器中,由于其对现代JavaScript特性的支持有限,许多新特性无法直接使用,因此会出现“对象不支持属性方法”的错误。以下是针对该问题的具体解决方法: #### 1. 检查是否为ES6语法方法 如果代码中使用了ES6及以上版本的语法方法(如`Array.prototype.includes`、`String.prototype.startsWith`等),需要将其转换为兼容性更高的ES5语法。例如,对于字符串的`trim`方法,可以手动扩展`String.prototype`以确保兼容性[^5]。 ```javascript if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }; } ``` #### 2. 替换不兼容的方法属性 某些方法属性在IE8中未被支持,例如`Object.definePrototype`[^1]和`bind`[^2]。需要根据具体需求替换为等效实现。以下是一个替代`bind`方法的示例: ```javascript Function.prototype.bind = Function.prototype.bind || function(context) { var self = this; return function() { return self.apply(context, arguments); }; }; ``` #### 3. 使用Polyfill库 为了简化兼容性处理,可以引入Polyfill库,例如`es5-shim``babel-polyfill`,这些库会自动为旧版浏览器添加缺失的功能支持。 #### 4. 确保jQuery版本兼容 在项目中使用jQuery时,需选择兼容IE8的版本。通常建议使用jQuery 1.x系列(如`jquery-1.9.1.min.js`),因为jQuery 2.x及更高版本已不再支持IE8[^2]。 #### 5. 避免使用HTML5和CSS3中的高级特性 IE8对HTML5和CSS3的支持非常有限,例如`flex`布局[^4]和某些CSS选择器。在开发时应尽量避免使用这些特性,者通过条件注释提供降级方案。 ```html <!--[if lt IE 9]> <script src="path/to/es5-shim.min.js"></script> <![endif]--> ``` #### 6. 使用条件注释检测浏览器版本 通过条件注释可以针对不同版本的IE浏览器加载特定的脚本样式文件,从而实现更精细的兼容性控制。 ```html <!--[if IE 8]> <script src="ie8-compat.js"></script> <![endif]--> ``` ### 示例代码:手动扩展`trim`方法并测试 以下是一个完整的示例,展示如何为IE8扩展`trim`方法,并验证其功能: ```javascript // 扩展String.prototype.trim方法 if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }; } // 测试trim方法 document.getElementById("demo").select(); var str = document.getElementById("demo").value; function test() { document.getElementById("demo").value = str.trim(); // 去除空格 document.getElementById("demo").select(); } ``` ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值