Javascript по модулю операции в IE7 - PullRequest
0 голосов
/ 16 ноября 2011

Для добавления класса к каждому третьему элементу в списке я использую операцию по модулю, как это:

var projectElements = document.getElementById("projectList").children;
var iCount = 0;
for (var i in projectElements) {
    iCount++;
    if (iCount % 3 == 0) {
        if (projectElements[i].className == "") {
            projectElements[i].className += "projectLinkLast";
        }
        else {
            projectElements[i].className += " projectLinkLast";
        }
    }
}

Отлично работает в Firefox и других браузерах, кроме Internet Explorer 7. Кто-нибудь знает, почему?

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Проблема не в операторе по модулю.Возможно, проблема в том, что вы используете for...in над хост-объектом (в данном случае это свойство children элемента), что является плохой идеей и не гарантирует, что она будет работать так, как вы ожидаете (или даже вообще).Кроме того, children поддерживается не во всех браузерах (хотя и в IE 7, поэтому проблема не в этом браузере).Вместо этого я бы предложил следующее:

var iCount = 0, child = document.getElementById("projectList").firstChild;
while (child) {
    if (child.nodeType == 1) { // Only deal with elements
        iCount++;
        if (iCount % 3 == 0) {
            if (child.className == "") {
                child.className = "projectLinkLast";
            }
            else {
                child.className += " projectLinkLast";
            }
        }
    }
    child = child.nextSibling;
}
1 голос
/ 16 ноября 2011

Попробуйте использовать .setAttribute("className", "blah") вместо .className.

Получил демонстрацию вашего кода на JSFiddle и, кажется, работает: http://jsfiddle.net/LWsTn/6/

Если вы собираетесь использовать jQuery.Использование:

$("#projectList :nth-child(3n").addClass("projectLinkLast");

Документация: http://api.jquery.com/nth-child-selector/

Используется метод addClass, который использует jQuery, который может помочь

classNames = value.split(rspace);

for (i = 0, l = this.length; i < l; i++) {
    elem = this[i];

    if (elem.nodeType === 1) {
        if (!elem.className && classNames.length === 1) {
            elem.className = value;

        } else {
            setClass = " " + elem.className + " ";

            for (c = 0, cl = classNames.length; c < cl; c++) {
                if (!~setClass.indexOf(" " + classNames[c] + " ")) {
                    setClass += classNames[c] + " ";
                }
            }
            elem.className = jQuery.trim(setClass);
        }
    }
}
...