jQuery-出现错误:对象不支持属性或方法“分配”

我正在通过WordPress网站上的此链接使用此jquery弹出插件。 在所有浏览器上都可以正常工作,但是在IE11上出现以下错误。

enter image description here

pragya rai asked 2020-02-13T09:53:19Z
11个解决方案
102 votes

就像其他人提到的那样,IE中不支持Object.assign()方法,但是有一个polyfill可用,只需在插件声明之前“包括”即可:

if (typeof Object.assign != 'function') {
  Object.assign = function(target) {
    'use strict';
    if (target == null) {
      throw new TypeError('Cannot convert undefined or null to object');
    }

    target = Object(target);
    for (var index = 1; index < arguments.length; index++) {
      var source = arguments[index];
      if (source != null) {
        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };
}

来自[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign]

测试页:[http://jsbin.com/pimixel/edit?html,js,output](只需删除polyfill,以得到与页面上相同的错误)。

Andres Ilich answered 2020-02-13T09:53:36Z
7 votes

@约翰·杜

我从您的评论中得知您想在节点/反应堆栈中实现此功能。 这与原始问题非常不同,您应该问自己的问题;)
无论如何,这是您需要做的...

您可以使用[es6-object-assign] [1]。 这是一个ES6 Object.assign()“ polyfill”。

首先,在根目录中的location_of_node_modules中,将node_modules添加为依赖项:

"dependencies": {
    "es6-object-assign": "^1.0.2",
    "react": "^0.12.0",
    ...
  },

然后,如果要在节点环境中使用它,请使用:

require('es6-object-assign').polyfill();

如果您在前端(浏览器)端遇到问题...
将其添加到index.html文件中...

<script src="location_of_node_modules/es6-object-assign/dist/object-assign.min.js"></script>
<script>
  window.ObjectAssign.polyfill();
</script>

location_of_node_modules取决于您使用的样板,大多数情况下只是node_modules,但是有时当index.html在您需要使用的子目录中时,../node_modules

shramee answered 2020-02-13T09:54:32Z
7 votes

按照文档,Object.assign()是一种新技术,在2015年的ECMAScript(ES6)标准的一部分:

[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign]

IE不支持它。

Vimalan Jaya Ganesh answered 2020-02-13T09:55:03Z
6 votes

该问题的可能解决方案:

在custombox.min.js之前添加脚本legacy.min.js

来源:custombox github项目

aprovent answered 2020-02-13T09:55:32Z
4 votes

@ Andres-Ilich对您的问题有正确的答案,但您提出的问题是错误的:

为什么不只使用一个支持IE的jQuery插件,如Zurb的出色Reveal:[https://github.com/zurb/reveal]

它将执行您想要的所有操作,并且不会引发此错误。

serraosays answered 2020-02-13T09:56:00Z
3 votes

目前我自己正在使用jQuery弹出窗口:[https://github.com/seahorsepip/jPopup]

拥有弹出窗口所需的一切,以及更多:D

无论如何,我现在正在写版本2,这是一个很大的重写,并添加了对IE6(版本1为IE7 +)的支持,并遇到了类似的错误...

导致IE6错误的原始代码:

//Insane code for an insane browser
this._vars.fakeScrollbar = $("<div style=\"position:absolute;top:expression(document.documentElement.scrollTop);right:0;bottom:0;margin-left:-200px;width:0;overflow-y:scroll;height:expression(document.documentElement.clientHeight);z-index:9999999;\"></div>");

我必须提出的技巧:

//Insane code for an insane browser
this._vars.fakeScrollbar = $("<div>");
this._vars.fakeScrollbar.html("<div style=\"position:absolute;top:expression(document.documentElement.scrollTop);right:0;bottom:0;margin-left:-200px;width:0;overflow-y:scroll;height:expression(document.documentElement.clientHeight);z-index:9999999;\"></div>");
this._vars.fakeScrollbar = this._vars.fakeScrollbar.children();
seahorsepip answered 2020-02-13T09:56:38Z
3 votes

由于您使用jQuery标记了问题,因此可以使用jQuery扩展功能。 不需要polyfill,它也可以进行深度合并。

例如:

var object1 = {
  apple: 0,
  banana: { weight: 52, price: 100 },
  cherry: 97
};
var object2 = {
  banana: { price: 200 },
  durian: 100
};

// Merge object2 into object1
$.extend( object1, object2 );

结果:

{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}
Kalimah Apps answered 2020-02-13T09:57:07Z
2 votes

当某些html元素ID与JavaScript函数中的某些变量具有相同的ID时,通常会发生这些错误。 更改其中一个的名称后,代码起作用了。

来源:SCRIPT438:对象不支持属性或方法IE

其他链接:jQuery验证IE对象不支持属性

Milap answered 2020-02-13T09:57:36Z
1 votes

基本上,并非所有浏览器都支持Object.assign,但是,如果当前浏览器不支持,则可以在arguments上重新分配它。

制作一个polyfill函数是很现实的,它的行为与ES6的Object.assign相同。

我认为最好的解决方案是迭代Object.assign之后的每个参数,考虑到对象和数组之间的迭代,将arguments对象的每个属性分配给target,以避免创建引用。 (可选)为了不丢失实例,您可以检测到该属性的最后一个实例是否仅等于"Array"Image,因此,如果您打算创建新的引用,则不会丢失274559427941761111269接口,但是对象具有 这些实例仍将作为参考。

编辑:原始Object.assign无法以这种方式工作。

根据此解决方案,我有自己的polyfill,可以在这里找到。

Hydroper answered 2020-02-13T09:58:15Z
0 votes

IE11的React解决方案

关于shramee的回答,它表示如下内容:

@JohnDoe在您的评论中,您想在节点/反应堆栈中实现它。 这与原始问题有很大不同,但是您可以使用es6-object-assign,ES6 startsWith“ polyfill”:

此polyfill已更新,现在可以做一些不同的事情:

  • 在根文件夹中的startsWith中,添加dist/作为依赖项(之后在命令行中执行<head>):

    startsWith

    或者简单地运行:startsWith

  • 要在节点环境中使用它:

    startsWith
  • 要在index.html中使用它,只需向其添加自动polyfill JS文件引用(如果您在startsWith中有调用dist/的脚本,则可以在<head>元素的末尾添加它)。

    1. 直接从startsWith调用:

      startsWith

      startsWith取决于您的项目结构(当index.html在子目录中时,您可能需要:dist/)。

    2. 但是,这可能不适用于您(由于startsWith文件夹访问权限,例如您正在使用create-react-app)。 如果是这样,只需将JS文件从dist/ node_modules文件夹复制到startsWith文件夹,然后:

      startsWith

      您可能要使用未缩小的文件并添加其他自定义的polyfill(例如startsWith)。

CPHPython answered 2020-02-13T09:59:42Z
0 votes

请添加脚本

<script src="https://cdn.jsdelivr.net/npm/es6-object-assign@1.1.0/dist/object-assign-auto.min.js"></script>

到html文件来解决此问题。

HoangDo answered 2020-02-13T10:00:06Z
translate from https://stackoverflow.com:/questions/35215360/getting-error-object-doesnt-support-property-or-method-assign