Следующее описание взято из этой страницы :
Метод getElementsByClassName () возвращает коллекцию всех элементов в документе с указанным именем класса, так как объект NodeList.
Объект NodeList представляет собой набор узлов. К узлам можно обращаться по номерам индексов. Индекс начинается с 0.
Совет. Вы можете использовать свойство length объекта NodeList для определения количества элементов с указанным именем класса, затем вы можете прокручивать все элементы и извлекать нужную информацию .
blockquote>Итак, поскольку параметр
getElementsByClassName
принимает имя класса.Если это ваше тело HTML:
то
var menuItems = document.getElementsByClassName('menuItem')
вернет коллекцию (а не массив) из трех верхних
s, поскольку они соответствуют заданному имени класса.Затем вы можете перебирать эти узлы (
s в этот случай) с помощью:for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) { var currentMenuItem = menuItems[menuItemIndex]; // do stuff with currentMenuItem as a node. }
Подробнее о различиях между элементами и узлами см. в этой записи .
5задан Jonathan Bondhus 21 May 2012 в 04:25поделиться
Вы можете использовать read -n 1
для чтения одного символа, а затем использовать оператор case
для выбора действия, которое необходимо предпринять на основе ключа.
При проблемах в том, что клавиши со стрелками выводят более одного символа и последовательность (и ее длина) изменяется от терминала к терминалу.
Например, на терминале, который я использую, стрелка вправо выдает ^[[C
. Вы можете видеть, какую последовательность выходов выберете, нажав Ctrl-V вправо. То же самое можно сказать и о других клавишах управления курсором, таких как Page Up и End.
Вместо этого я рекомендовал бы использовать односимвольные клавиши, такие как <
и >
. Обработка их в вашем скрипте будет намного проще.
read -n 1 key
case "$key" in
'<') go_left;;
'>') go_right;;
esac
Как упоминалось ранее, клавиши курсора генерируют три байта - и ключи, такие как home / end, даже генерируют четыре! Решение, которое я видел где-то, должно было позволить первому one-char read () следовать за тремя последующими односимволами с очень коротким таймаутом. Наиболее распространенные последовательности клавиш можно показать следующим образом:
#!/bin/bash
for term in vt100 linux screen xterm
{ echo "$term:"
infocmp -L1 $term|egrep 'key_(left|right|up|down|home|end)'
}
Кроме того, / etc / inputrc содержит некоторые из них с отображением readline. Итак, отвечая на исходный вопрос, вот отрезок из этого меню bash i 'просто взломать:
while read -sN1 key # 1 char (not delimiter), silent
do
# catch multi-char special key sequences
read -sN1 -t 0.0001 k1
read -sN1 -t 0.0001 k2
read -sN1 -t 0.0001 k3
key+=${k1}${k2}${k3}
case "$key" in
i|j|$'\e[A'|$'\e0A'|$'\e[D'|$'\e0D') # cursor up, left: previous item
((cur > 1)) && ((cur--));;
k|l|$'\e[B'|$'\e0B'|$'\e[C'|$'\e0C') # cursor down, right: next item
((cur < $#-1)) && ((cur++));;
$'\e[1~'|$'\e0H'|$'\e[H') # home: first item
cur=0;;
$'\e[4~'|$'\e0F'|$'\e[F') # end: last item
((cur=$#-1));;
' ') # space: mark/unmark item
array_contains ${cur} "${sel[@]}" && \
sel=($(array_remove $cur "${sel[@]}")) \
|| sel+=($cur);;
q|'') # q, carriage return: quit
echo "${sel[@]}" && return;;
esac
draw_menu $cur "${#sel[@]}" "${sel[@]}" "$@" >/dev/tty
cursor_up $#
done
Вы можете читать клавиши со стрелками, а также другие клавиши без каких-либо необычных команд; вам просто нужно два вызова read
вместо одного:
escape_char=$(printf "\u1b")
read -rsn1 mode # get 1 character
if [[ $mode == $escape_char ]]; then
read -rsn2 mode # read 2 more chars
fi
case $mode in
'q') echo QUITTING ; exit ;;
'[A') echo UP ;;
'[B') echo DN ;;
'[D') echo LEFT ;;
'[C') echo RIGHT ;;
*) >&2 echo 'ERR bad input'; return ;;
esac
Не уверен, что это ответ на вопрос напрямую, но я думаю, что это связано - я блуждал, откуда берутся эти коды, и я наконец нашел:
Сначало немного сложно читать; для левой стрелки найдите «LEFT 4» в столбце «Key», а для последовательности, которую видит bash
, найдите пятый столбец «keymap» - «normal»), где он написан как «[D 1b 5b 44 "- это три байта (27, 91, 68), представляющие этот ключ.
Поиск потока Как читать клавиши со стрелками по действительно старому bash? - Форумы UNIX и Linux вдохновили меня написать короткий однострочный вкладыш, который сбрасывает коды клавиш нажатых клавиш. В основном, вы нажимаете клавишу, затем Enter (для запуска окончания read
), а затем используйте hexdump
для вывода того, что read
сохранил (и, наконец, нажмите Ctrl-C, чтобы выйти из цикла):
$ while true; do read -p?; echo -n $REPLY | hexdump -C; done
?^[[D
00000000 1b 5b 44 |.[D| # left arrow
00000003
?^[[C
00000000 1b 5b 43 |.[C| # right arrow
00000003
?^[[1;2D
00000000 1b 5b 31 3b 32 44 |.[1;2D| # Shift+left arrow
00000006
?^[[1;2C
00000000 1b 5b 31 3b 32 43 |.[1;2C| # Shift+right arrow
00000006
?^C
Итак, в то время как клавиши со стрелками требуют 3 байта - клавиши Shift + стрелки требуют 6! Однако, казалось бы, все эти последовательности начинаются с 0x1b (27), поэтому можно проверить это значение для read -n1
, прежде чем читать больше байтов; также 5b
остается вторым байтом в многобайтовой последовательности для столбцов «normal» и «shift / NUM-Lock» в таблице выше.
Изменить: намного проще и правильнее сканирование терминальных кодов нажатых клавиш в Linux осуществляется через showkey :
$ showkey
Couldn't get a file descriptor referring to the console
$ showkey -h
showkey version 1.15
usage: showkey [options...]
valid options are:
-h --help display this help text
-a --ascii display the decimal/octal/hex values of the keys
-s --scancodes display only the raw scan-codes
-k --keycodes display only the interpreted keycodes (default)
$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program
^[[A 27 0033 0x1b
91 0133 0x5b
65 0101 0x41
^[[B 27 0033 0x1b
91 0133 0x5b
66 0102 0x42
^[[A 27 0033 0x1b
91 0133 0x5b
65 0101 0x41
^[[D 27 0033 0x1b
91 0133 0x5b
68 0104 0x44
^[[C 27 0033 0x1b
91 0133 0x5b
67 0103 0x43
^C 3 0003 0x03
^M 13 0015 0x0d
^D 4 0004 0x04
# This will bind the arrow keys
while true
do
read -r -sn1 t
case $t in
A) echo up ;;
B) echo down ;;
C) echo right ;;
D) echo left ;;
esac
done
((var += value))
или((var++))
вместоvar=$((var+value))
. Например:((total_time -= mo * 2629746))
. Выполнениеvar=$((0))
не требуется, просто используйтеvar=0
. Целочисленные сравнения:while (( line_number <= total ))
. Используйте$()
вместо backticks для подстановки команды. Вам не нужен awk:wc -l < filename
– Dennis Williamson 21 May 2012 в 17:04