仅Mootools 1.3.2和IE8错误,对象不支持属性/方法

问题描述 投票:2回答:4

我的脚本仅在IE8中引发错误。我正在使用Mootools 1.3。

抛出的错误是:

对象不支持此属性/方法。

IE8调试器告诉我错误是这样的(带有**的行):

append: function(original){
    for (var i = 1, l = arguments.length; i < l; i++){
        var extended = arguments[i] || {};
        **for (var key in extended) original[key] = extended[key];**
    }
    return original;
}

上面的代码在未压缩版本的380行附近。它是Object.extend的一部分。

现在,我怀疑在对类似对象的数组进行每次处理时会发生这种情况。这是我怀疑触发此代码的代码:

var self = this,
    c = certManager.addedCerts,
    e = window.expManager.workExp,
    cA = this.cA = [],
    eA = this.eA = [];
    c.each(function(x){
        cA.push(x.value);
    });
    e.each(function(x){
        eA.push(x.retrieve('info'));
    });

第一个数组(c)仅填充数字。第二个(e)填充有正在进行存储/检索的对象。

类似数组的对象声明如下:

addedCerts = this.addedCerts = []

workExp = this.workExp = []

在它们各自的模块(certManager和expManager)中。

有人知道为什么会这样吗?

编辑:

根据要求,这是workExp的填充方式:

var r = $('resumeContent'),
                h = "<div class=\"contentRowRight\"><a href=\"#\" class=\"xHover remove\" > </a><br/>" + yV + " " + mV + "</div><strong>" + pV + "</strong><br />" + cV,
                n = new Element('div', {html: h, 'class': 'contentRow'}).inject(r, 'top');
            n.getElement('.remove').addEvents({
                'click': function (e) {
                    e.preventDefault();
                    self.removeExp(this);
                },
                'mouseover': function(){
                    var el = this;
                    this.store('mO', true);
                    (function() {
                        if (el.retrieve('mO')){
                            el.fieldToolTip('Remove Experience',false,false);
                            el.store('mO', false);
                        }
                    }).delay(500);
                },
                'mouseout': function(){
                    this.store('mO', false);
                    this.removeToolTip();
                }
            });
            n.store('info', {'p': pV, 'c': cV, 'y': yV.replace(' year', '').replace('s', '').replace(' and', ''), 'm': mV.replace('month', '').replace('s', '')});
            this.workExp[this.workExp.length] = n;

我正在做的是表单的一部分。我在表单中有几个字段,您填写它们,然后单击“添加”按钮,它将创建一个新的“行”。这些行包含有关用户工作经历的信息。一旦用户添加了他所有的工作经验,他就可以继续填写表格。表单全部填写完毕后,我将遍历数组对象并将其转换为JSON对象,然后将其放入一个隐藏值并将其传递给后端。

[如果您想查看正在运行的脚本,则可以访问http://www.oilforce.com/user-signup.php。您将被迫填写第一页,即个人信息(您可以输入垃圾内容,这并不意味着您还是要提交它),然后按下3次。在第四页上,有工作经验表格。这就是上面的代码正在做的。

javascript internet-explorer-8 mootools
4个回答
2
投票

错误是由于我的表单中存在一个字段而引起的。该字段的ID为“位置”,显然与ie8中的某些内容发生冲突。将我的字段重命名为“ pos”,现在一切似乎都可以正常工作。


0
投票

我遇到了完全相同的错误。

我的代码很简单:

alert(document.id('YouTubeFlashPlayer').get('id'));

但是它是通过MooTools类对象内的Element.addEvent()运行的。上面令人反感的方法是

.get()

好像IE8 完全忽略MooTools扩展方法,因为

document.id('YouTubeFlashPlayer')

实际上将警告HTML对象。

我快要用IE8了。我正在考虑通过

消除它
if(Browser.ie8) document.getElement('body').dispose();

0
投票

确定,我正在调试代码。.我认为您的问题是当您尝试显示验证消息的工具提示时。我的猜测是工具提示必须播放的声音存在问题。

我的建议是更改此行:

validateStep: function(x) {
 ...
 // line 6230
 this.fields[i].fieldToolTip('Your ' + names[i] + ' should be a minimum of ' + (lengths[i]+1) + ' characters.');

简单的alert()(或者可能只是注释此行)只是为了查看这是否是问题。如果这是问题,您可以禁用声音,希望您不会有此问题

祝你好运!


0
投票

如果您对项目使用编译,则可以考虑在入口点(文件)的顶部尝试

import 'core-js'

目前core-js polyfill library是提供跨浏览器支持的最简单方法

© www.soinside.com 2019 - 2024. All rights reserved.