Jump to content
  • 0

Чередующиеся строки в таблице


Vlad
 Share

Question

Написал небольшой скрипт, который в любой таблице поочередно меняет цвет строки: светлая, темная, светлая, темная...

Посмотрите на предмет правильности описания и возможных ошибок.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Чередующиеся строки</title>
<script type="text/javascript">
zebraTable = function() {

// Получаем массив всех таблиц на странице
tables = document.getElementsByTagName("table");

// Пробегаемся по массиву таблиц
for (i = 0; i < tables.length; i++) {

// Если у таблицы стоит class="zebra", то делаем чередующиеся строки
if (tables[i].className == "zebra") {

// Получаем массив всех строк в нужной таблице
tr = document.getElementsByTagName("tr");

// Пробегаемся по всем строкам таблицы
for (j = 0; j < tr.length; j++) {

// Для нечетных строк устанавливаем class="odd"
if (j%2) tr[j].className = "odd";
}
}
}
}
window.onload = zebraTable;
</script>
<style type="text/css">
table.zebra {
width: 100%; /* Ширина таблицы */
border-collapse: collapse; /* Убираем двойные линии между ячеек */
}

table.zebra td {
padding: 4px; /* Поля в ячейках */
border: 1px solid #666; /* Граница между ячеек */
}

table.zebra thead {
background: #fc0; /* Цвет фона заголовка */
}

table.zebra tbody tr {
background: #f0f0f0; /* Цвет фона четных строк */
}
table.zebra tbody tr.odd {
background: #ccc; /* Цвет фона нечетных строк */
}
</style>
</head>
<body>
<table class="zebra">
<thead>
<tr><td>Место</td><td>Оценка</td><td>Фильм</td><td>Год выпуска</td></tr>
</thead>
<tbody>
<tr><td>1</td><td>9.1</td><td>Крестный отец</td><td>1072</td></tr>
<tr><td>2</td><td>9.1</td><td>Побег из Шоушенка</td><td>1994</td></tr>
<tr><td>3</td><td>9.0</td><td>Крестный отец 2</td><td>1974</td></tr>
<tr><td>4</td><td>8.9</td><td>Хороший, плохой, злой</td><td>1966</td></tr>
<tr><td>5</td><td>8.8</td><td>Криминальное чтиво</td><td>1994</td></tr>
<tr><td>6</td><td>8.8</td><td>Список Шиндлера</td><td>1993</td></tr>
<tr><td>7</td><td>8.8</td><td>Звездные войны: эпизод 5</td><td>1980</td></tr>
<tr><td>8</td><td>8.8</td><td>Полет над гнездом кукушки</td><td>1975</td></tr>
<tr><td>9</td><td>8.8</td><td>Касабланка</td><td>1942</td></tr>
<tr><td>10</td><td>8.8</td><td>Семь самураев</td><td>1954</td></tr>
</tbody>
</table>
</body>
</html>

Link to comment
Share on other sites

  • Answers 57
  • Created
  • Last Reply

Top Posters For This Question

Top Posters For This Question

Recommended Posts

  • 0
Вас вводит в заблуждение тот факт, что global object одновременно используется и как variable object? Так ведь Вас предупреждали, что он особенный, уникальный:

Меня не вводит. При конкретной реализации, global object часто не одно и то же что и variable object.

http://lxr.mozilla.org/seamonkey/source/js.../jsinterp.c#522

Вы в очередной раз садитесь в лужу. Вы внимательно читали пункт, на который ссылаетесь? Если да, то почему не смогли понять? Попробую помочь Вам в очередной раз. Итак, Вы задали вопрос:

Да, тут пропедалил немного. При декларации переменных создаются проперти с NULL'евыми значениями. (в мозилле по крайней мере это так http://lxr.mozilla.org/seamonkey/source/js...sinterp.c#4539)

Link to comment
Share on other sites

  • 0
Меня не вводит. При конкретной реализации, global object часто не одно и то же что и variable object.

Каким образом указанная вами ссылка подтверждает факт существования отдельного Variable Object для глобальных переменных? Лично я там увидел такие функции, как ComputeGlobalThis, ComputeThis, js_ComputeThis. ComputeGlobalThis, например, получая в качестве параметров cx (JSContext, объект, который в данном случае интересен тем, что имеет указатель на Global Object) и непосредственно argv (jsval ? какое-либо javascript?овое значение), пытается получить значение "parent" для js-значения и сравнить его со значением, хранящимся в cx->globalObject. Там ведь даже есть пример, который демонстрирует то, что может стать причиной вызова этий функций. Я Вам предлагаю еще один пример (работает в JavaScirpt , где есть св-во __parent__):

/**
* @param {Object} aWindow Reference to the current Window object
*/
function F(aWindow) {
if (typeof aWindow == 'object') {
alert(F.__parent__ === aWindow);
};
};

Причем здесь отношения между Variable Object и Global Object? Если решили покопаться в исходниках, то начните с JS GetGlobalObject - там черным по белому написано:

In JavaScript, global variables are stored as properties of the global object.

Давайте-ка я Вам кое-что напомню. Я заявил, что в случае zebra = function () {};

? не объявляется никакая переменная в глобальном контексте! Создается св-во глобального объекта, отличающееся от переменных хотя бы тем, что не имеет атрибута { DontDelete }.

Что непонятно в первом предложении? Если в вышеупомянутом скриптовом выражении операнд слева называется undeclared variable, то как можно одновременно называть этот процесс объявлением переменной? Объявление необъявленной переменной (declare undeclared variable)? Нет уж, давайте так - undeclared значит undeclared, и этим все сказано!

Со вторым предложением в моем заявлении все, конечно, несколько сложнее. Мое мнение в данном случае вступает в противоречие с привычным представлением переменных. Вы именно за этот факт уцепились, как утопающий за соломинку. Вам вдруг показалось, что я не осознаю, что переменные становятся свойствами. Однако, я прекрасно понимаю, что переменные становятся именованными св-вами Variable Object. Но их не принято называть свойствами Variable Object. Одна из причин - Variable Object на самом деле является абстрактной сущностью с точки зрения ECMAScript Language Specification. Вот что он из себя представляет со слов ECMAScript-гуру:

Richard Cornford:

The activation object is another specification mechanism. It can be considered as an object because it ends up having accessible named properties, but it is not a normal object as it has no prototype (at least not a defined prototype) and it cannot be directly referenced by javascript code.

А в случае с глобальными переменными понимание происходящего затрудняет еще и то, что в качестве Variable Object используется непосредственно Global Object. И тут действительно может возникнуть полная неразбериха. Ведь что получается ? все переменные можно называть свойствами Global Object, и наоборот ? все свойства Global Object (в том числе и every Native Object) можно называть глобальными переменными. Разобраться в этом может помочь спецификация. Почему мы не называем, к примеру, Object, переменной? Да потому, что в спецификации для этой функции есть достаточно точное, полностью соответствующее ее предназначению определение. То же самое и в случае с переменными (variables) ? не надо ничего придумывать, ведь дано определение, есть описание:

12.2 Variable statement (var VariableDeclarationList)

If the variable statement occurs inside a FunctionDeclaration, the variables are defined with function-local scope in that function, as described in section 10.1.3. Otherwise, they are defined with global scope (that is, they are created as members of the global object, as described in section 10.1.3) using property attributes { DontDelete }.

Попадает ли zebra под это описание. Мне кажется, что нет. Создание свойства глобального объекта zebra больше похоже на то, что присходит, как в случае window.zebra = что_нибудь;, или какой_нибудь_другой_объект.zebra = что_нибудь;

Как правило, именно сравнение того, что происходит может помочь разобраться. А ваше желание дать описание, "абстрагируясь от алгоритма работы интерпретатора", наоборот, может лишь все усложнить.

Вообще, когда процессору необходимо выполнить какие-либо инструкции (а программист в этом случае видит какие-то ключевые слова языка, к примеру var), то и тот, и другой должны знать - для чего инструкци предназначены, какая последовательность действий должна быть выполнена, и каким должен быть результат. Позволю себе еще один пример из JavaScript 1.5 (SpiderMonkey):

const a = 1; // => created with attributes { DontDelete, ReadOnly }.

var b = 1; // => created with attributes { DontDelete }.

c = 1; // => created with empty attributes.

Из примера видно, что

1. директива conts позволяет создать константу, доступную только для чтения. Потытки записи/удаления потерпят неудачу;

2. директива var позволяет создать переменную, доступную для чтения/записи, но не для удаления;

3. неквалифицированная переменная (или иными словами, черт знает что), несмотря ни на что, станет свойством глобального объекта в момент операции присвоения значения, получит пустые атрибуты, и будет доступна для чтения/записи/удаления (как и полагается свойствам объектов, создаваемых "ручками").

Все три варианта имеют свои отличительные черты. Первый и второй подразумевают создание константы и переменной на нулевой строке кода (как выражается Zeroglif), т.е. они создаются до начала выполнения программы (или функции). Они имеют необходимые атрибуты, чтобы полностью соответствовать статусу, определяемому ключевыми словами. То, что присходит в третьем случае, я уже охарактеризовал, и могу добавить, что к первым двум это точно не имеет никакого отношения.

Я могу, конечно же, ошибаться, но моему пониманию гораздо ближе фомулировка Zeroglif:

Переменные (variables) объявляются с помощью ключевого слова var. Неявное объявление переменных - художественный вымысел неизвестного автора. Нет var - нет переменной!
Link to comment
Share on other sites

  • 0
Переменные (variables) объявляются с помощью ключевого слова var. Неявное объявление переменных - художественный вымысел неизвестного автора. Нет var - нет переменной!

Это не вымысел неизвестного автора, это было в доках по JS до версии 1.4 http://devedge-temp.mozilla.org/library/ma...uide/ident.html

Declaring Variables

You can declare a variable in two ways:

* By simply assigning it a value. For example, x = 42

* With the keyword var. For example, var x = 42

Со временем переработали отношение к декларации переменной.

Link to comment
Share on other sites

  • 0

почитал, посмеялся... особенно радуют фразы типа

общение с Вами - бесполезное занятие

, а потом раз за разом ответы и дальнейшее общение, что основываясь на фразу, приведенную выше, есть ярко выраженный мазохизм :)

2s0rr0w, ну зачем поднимать древнюю тему? лехче не станет и оппонентов вы ни в чем не убедите :( я тоже пишу обычно functionName = function(), тем не менее это не значит, что вы всех и каждого должны убеждать в этом :(

Link to comment
Share on other sites

  • 0
2s0rr0w, ну зачем поднимать древнюю тему? лехче не станет и оппонентов вы ни в чем не убедите :) я тоже пишу обычно functionName = function(), тем не менее это не значит, что вы всех и каждого должны убеждать в этом :(

Информация вспоминается не сразу. Я точно помнил, что декларация переменных в JS была не обязательной при при помощи var, но не мог вспомнить где.

Вспомнил, решил запостить.

Link to comment
Share on other sites

  • 0

Добавлю и я каплю :) . У меня стояла задача раскрасить в зебру таблицу одними только ксс, без скрипта. Наткнулся на это, может кому поможет: http://www.lysenka.net/web/6/

Правда в конечном итоге всеравно получается что юзаешь скрипт, но все же.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy