Mootools 1.3.2& IE8 Only Error,Object不支持属性/方法

时间:2011-07-29 04:04:01

标签: javascript internet-explorer-8 mootools

我的脚本只在IE8中抛出错误。我正在使用Mootools 1.3。

抛出的错误是:

Object不支持此属性/方法。

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&amp; 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次。在第四页上,有工作经验表格。这就是上面的代码正在做的事情。

4 个答案:

答案 0 :(得分:2)

错误源于我在表单中的字段。该字段的id是'position',显然与ie8中的某些内容发生冲突。将我的字段重命名为'pos',现在一切似乎都有效。

答案 1 :(得分:0)

我收到完全相同的错误。

我的代码非常简单:

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

但是它是通过MooTools Class对象中的Element.addEvent()运行的。上面的违规方法是

.get()

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

document.id('YouTubeFlashPlayer')

实际上会警告HTML对象。

我差点就在IE8的最后。我正在考虑通过

将其驱逐出去
if(Browser.ie8) document.getElement('body').dispose();

答案 2 :(得分:0)

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

我的建议是改变这一行:

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

到一个简单的alert()(或者只是评论这一行)只是为了看看这是不是问题。如果这是问题,你可以禁用声音,希望你不会遇到这个问题

祝你好运!

答案 3 :(得分:0)

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

import 'core-js'

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