2015-02-06 2 views
0

Я пытаюсь изучить JavaScript, и я видел код для изменения стиля CSS на веб-странице в зависимости от кнопки, которую вы нажимаете.Не могу понять Javascript eventhandler with for loop code

Я не могу понять, почему и как цикл петли указывает, что кнопка ведьмы была нажата. Вот Javascript часть:

var buttons = document.getElementsByTagName("button"); 

var len = buttons.length; 

for (i = 0; i < len; i++) { 
    buttons[i].onclick = function() { 
    var className = this.innerHTML.toLowerCase(); 
     document.body.className = className; 
    }; 
} 

http://jsfiddle.net/qp9jwwq6/

Я посмотрел на сети и w3 школы, но они не объясняют, что код для цикла. Может кто-нибудь объяснить это мне?

Спасибо

+0

добавьте клик-прослушиватель для каждого '

ответ

1

Позволяет сломать его.

Сначала нам нужно иметь доступ к элементу DOM на странице, поэтому мы делаем это, используя метод на самом document, который вернет элемент, который мы хотим манипулировать.

var buttons = document.getElementsByTagName("button"); 

buttons вар будет список всех кнопок на этой странице. Мы хотим что-то сделать со всеми из них, поэтому сначала мы кэшируем длину списка, т. Е. Подсчитываем, сколько кнопок у нас есть.

var len = buttons.length; 

Тогда мы в основном говорят: множество я до 0, и шаг его один, пока его равно числу кнопок мы имеем.

for (i = 0; i < len; i++) { 

Теперь, чтобы получить доступ к одной кнопке из списка, нам нужно использовать обозначение скобок. Итак, buttons[0] - первый элемент, buttons[1] - второй и т. Д. Так как i начинается с 0, мы кладем i в скобки, чтобы на каждой итерации он получил доступ к следующей кнопке в списке.

buttons[i].onclick = function() { 
    var className = this.innerHTML.toLowerCase(); 
     document.body.className = className; 
    }; 
} 

Это эквивалентно делать:

buttons[0].onclick = function() { 
    var className = this.innerHTML.toLowerCase(); 
     document.body.className = className; 
    }; 

buttons[1].onclick = function() { 
    var className = this.innerHTML.toLowerCase(); 
     document.body.className = className; 
    }; 

buttons[2].onclick = function() { 
    var className = this.innerHTML.toLowerCase(); 
     document.body.className = className; 
    }; 

// etc. 

Но, конечно, это супер неэффективна, и мы не знаем, сколько кнопок страница. Итак, мы получаем все кнопки там, узнаем, сколько их есть, затем пройдите через каждую кнопку и назначьте обработчик события вместе с новым классом.

Теперь, глядя на самого OnClick обработчик мы можем видеть, что это первый находит HTML внутри кнопка будет нажата, превращает его в строчными буквами, и присваивает его переменной:

var className = this.innerHTML.toLowerCase(); 

С помощью this мы гарантируем, что каждая кнопка будет знать, чтобы получить это собственное innerHTML при нажатии. Мы не отслеживаем, какая кнопка это, мы просто говорим каждой кнопке, чтобы проверить ее собственный контент.

Тогда что он делает это изменить класс body HTML элемента к тому, что это то, что мы просто разобраны

document.body.className = className; 

Так что у вас есть что-то вроде

<button>success</button> 
<button>failure</button> 
<button>warning</button> 

Нажатие первой кнопки будет установите класс элемента <body> на success, щелкнув второй, установите его на failure, а третий установит его на warning.

0

Первая строка сохраняет все кнопки в переменной, называемой кнопками. Это фактически массив, так как на странице может быть несколько кнопок. Затем вы перебираете каждую кнопку и определяете функцию, которая должна выполняться onclick. Допустим, у вас есть две кнопки, тогда это будут кнопки [0] и кнопки [1], которые получают функцию.

0

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

Переходит к ответу:

для-петля «не показывает», которая была нажата кнопка. Скорее, он проходит через каждый элемент кнопки на странице и присваивает точное определение функции атрибуту onclick каждого элемента. Код, который заканчивается при нажатии на конкретный элемент кнопки (здесь я говорю о теле функции), назначает класс CSS элементу body, назначая document.body.className.

Ваш вопрос спрашивает, как функция знает, какое имя класса назначить document.body.className. Функция захватывает имя класса из innerHTML элемента кнопки, доступного как this.innerHTML (поскольку в обработчике события this является ссылкой на элемент, на котором произошло событие запуска). Элемент HTML <button> является немного особенным, тем не менее, хотя он, как правило, простая кнопка, это также не листовой узел, то есть он содержит свой собственный HTML. Вы можете разместить там много вещей, но в этом примере у них просто есть текстовый узел, который состоит из точно (или почти точно) имени класса (Normal для одного и Changed для другого). Вот как функция может получить имя класса CSS, характерное для этой кнопки; он захватывает его из текста внутри элемента clicked <button>.

Я сказал «почти точно» там, потому что на самом деле разница между текстовыми буквами и фактическими классами CSS, которые они определили в правилах CSS (на самом деле это normal и changed). Поэтому перед назначением имени класса они должны опустить буквенный код извлеченного текста кнопки (toLowerCase()). Классы CSS чувствительны к регистру (см. Are CSS selectors case-sensitive?).

Как я уже сказал, это необычный код. Нецелесообразно создавать сопоставление (особенно неточное сопоставление!) Между простым текстом HTML и метаданными кода (в этом случае классы CSS).