转换为IE的JavaScript

时间:2010-01-30 03:21:19

标签: javascript internet-explorer

我有一个脚本在我到目前为止测试的所有浏览器(FF,Safari,camino,Chrome)中运行良好,但在IE中却没有,我无法弄清楚原因。 IE 8(Windows 7)调试实用程序突出显示了脚本的这一部分:

if(list[lineNum].getElementsByClassName("check")[0].getElementsByTagName("a")[0].getAttribute("title").search("Delete")==0)

并说:

  

Object不支持此属性或方法

我想也许IE可能不喜欢列表数组所以我在脚本开头添加了一个显式声明

var list=new Array();

但我仍然得到同样的错误。

我非常希望能够在IE上工作,并且非常感谢您提供帮助。

感谢

6 个答案:

答案 0 :(得分:4)

Internet Explorer没有本机getElementsByClassName支持。根据麻省理工学院的许可,很多人都会使用一个项目it's available on Google Code here

您的代码会变得类似(未经过测试,只是一个示例):

if(getElementsByClassName("check", null, list[lineNum])[0].getElementsByTagName("a")[0].getAttribute("title").search("Delete")==0)

我真的建议使用jQuery 。它旨在使这些事情变得简单。

答案 1 :(得分:1)

有很多IE用户 - 那么除非你的爱好网站,否则你需要支持它。 您可以通过提供自己的方法来加速IE8,但对于其他IE和旧版浏览器,您需要 更改代码,这样就不会调用不存在的方法。

我定义了一个分支方法,该方法在可用时使用getElementsByClassName,或者 循环遍历元素的后代,查看属性,否则。请记住,对象可以有多个类。

/* @classes: space separated string of class names

   @pa:parent element reference
*/   
        document.getbyClass= function(classes, pa){
            pa= pa && pa.nodeType== 1? pa: document;
            if(pa.getElementsByClassName){
                return pa.getElementsByClassName(classes);
            }
            var elems= [], c= classes.split(/ +/), L= c.length, tem, temc, 
            tags= pa.getElementsByTagName('*'), max= tags.length;
            for(var i= 0, L= c.length; i< L; i++){
                c[i]= RegExp('\\b'+c[i]+'\\b');
            }
            getbyClassloop: 
            while(max){
                i= L;
                tem= tags[--max];
                temc= tem.className;
                if(temc){
                    while(i){
                        if(!c[--i].test(temc)) continue getbyClassloop;
                    }
                    elems[elems.length]= tem;
                }
            }
            return elems;
        }

//更快的IE8方法

(function(){
    if(!document.getElementsByClassName){
        try{
            if(document.querySelectorAll && document.attachEvent){
                var IE8class= function(classes){
                    var C= classes.split(' '), tem,
                    els= Array.from(this.querySelectorAll('.'+ C.shift()));
                    while(C.length && els.length){
                        tem= C.shift();
                        els= els.testEach(function(itm){
                            return itm.className.indexOf(tem)!= -1;
                        });
                    }
                    return els;
                }
                HTMLDocument.prototype.getElementsByClassName= IE8class;
                Element.prototype.getElementsByClassName= IE8class;
                return true;
            }
        }
        catch(er){return false};
    }
})()

/ * 这两种方法与上面的方法一起使用...也许你应该让IE在标签筛选组中与它的亲戚一起奋斗.. * /

  Array.prototype.testEach= function(fun){
        var A= [], tem, L= this.length;
        for(var i= 0; i< L; i++){
            tem= this[i];
            if((!fun && !!tem) || !!fun(tem)) A[A.length]= tem;
        }
        return A;
    }

    Array.from= function(what){
        var L, A= [];
        if(what){
            L= what.length;
            if(L){
                while(L) A[--L]= what[L];
                return A;
            }
            if(what.hasOwnProperty){
                for(var p in what){
                    if(what.hasOwnProperty(p)) A[A.length]= what[p];
                }
            }
        }
        return A;
    }

答案 2 :(得分:1)

IE中不存在

getElementsByClassName

这是完全为什么建议使用标准的,跨浏览器兼容的框架,如Prototype,Dojo,jQuery,YUI,Mootools或其他任何其他框架。

我相信(你所拥有的陈述是巨大的,如果没有测试HTML,很难确定),这相当于......

jQuery的:

if ( $(".check a[title^=Delete]", list[lineNum]) == 0 ) {}

Protoype:

if ( $(list[lineNum]).select(".check a[title^=Delete]") == 0 ) {}

道场

if ( dojo.query(".check a[title^=Delete]", list[lineNum]) == 0 ) {}

简单干净。你明白了。

如果某个库不适合您,则提供的functions that kennebec可能是一个很好的解决方案。

答案 3 :(得分:0)

没有测试,我相信有问题的可能是getElementsByClassName。

调试它的显而易见的方法是将其分解为几个子语句。

答案 4 :(得分:0)

我相信你可能已经意识到了,但这种情况是jQuery等框架如此受欢迎的主要原因之一。根据你的项目,javascript框架可能不是这个问题的现实解决方案,但是如果你可以自由地使用像jQuery这样的东西,它会让你从这样的问题中抽象出来,这样在大多数情况下,你永远不必担心再次关于他们。

答案 5 :(得分:0)

正如Brian McKenna所说,本机getElementsByClassName()在IE6 / 7/8上不可用。
在IE8上,您可以将您的行重写为:

if(list [lineNum] .querySelector(“。check”)。querySelector(“a”)。getAttribute(“title”)。search(“Delete”)== 0)

这也适用于FF / Safari / Chrome / Opera的最新版本。但不是IE6 / 7 有标准化库可以在IE6 / 7上为您提供querySelector。见
Any JavaScript Frameworks with the aim of standard based cross-platform JS and DOM?