Конвертировать JavaScript для IE - PullRequest
0 голосов
/ 30 января 2010

У меня есть скрипт, который отлично работает во всех браузерах, которые я тестировал до сих пор (FF, Safari, camino, Chrome), но не в IE, и я не могу понять, почему.Утилита отладки IE 8 (windows 7) выделяет этот раздел скрипта:

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

и говорит:

Объект не поддерживает это свойство или метод

Возможно, я подумал, что, возможно, IE не любит массив списков, поэтому я добавил явное объявление в начале скрипта

var list=new Array();

, но все равно получаю ту же ошибку.

Мне бы очень хотелось, чтобы это работало на IE, и я был бы признателен за любую помощь в этом.

спасибо

Ответы [ 6 ]

4 голосов
/ 30 января 2010

Internet Explorer не имеет встроенной поддержки getElementsByClassName. Есть проект, который многие люди используют в качестве альтернативы, он доступен в Google Code здесь по лицензии MIT.

Ваш код станет чем-то вроде (не проверено, просто пример):

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

Я бы действительно рекомендовал , используя jQuery . Он создан, чтобы упростить эти вещи.

1 голос
/ 30 января 2010

getElementsByClassName не существует в IE.

Это точно причина, по которой рекомендуется использовать стандартную, совместимую с браузером среду, такую ​​как 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 ) {}

Dojo

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

Просто и чисто. Вы поняли идею.

Если библиотека не подходит для вас, то функции , которые предоставляет kennebec , вероятно, являются хорошим решением.

1 голос
/ 30 января 2010

Существует много пользователей 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};
    }
})()

/ * эти 2 метода используются с вышеупомянутым ... возможно, вы должны позволить 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;
    }
0 голосов
/ 30 января 2010

Как сказал Брайан МакКенна, собственный метод getElementsByClassName () недоступен в IE6 / 7 / 8.
В IE8 вы можете переписать свою строку как:

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

Это также будет работать в последних версиях FF / Safari / Chrome /Opera.Но не IE6 / 7.
Существуют библиотеки стандартизации, которые предоставят вам querySelector в IE6 / 7.См.
Какие-либо фреймворки JavaScript с целью создания стандартных кроссплатформенных JS и DOM?

0 голосов
/ 30 января 2010

Я уверен, что вы, вероятно, уже знаете, но этот сценарий является одной из основных причин, почему фреймворки, такие как jQuery и т. Д., Так популярны. В зависимости от вашего проекта javascript Framework может не быть реалистичным решением этой проблемы, но если вы можете использовать что-то вроде jQuery, это отвлечет вас от подобных проблем, так что по большей части вам никогда не придется беспокоиться о них снова.

0 голосов
/ 30 января 2010

Без тестирования, я думаю, что нарушитель, вероятно, getElementsByClassName.

Очевидный способ отладки этого состоял бы в том, чтобы разбить его на несколько подзадач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...