Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Для нескольких input одна функция (https://javascript.ru/forum/events/51847-dlya-neskolkikh-input-odna-funkciya.html)

krutoy 21.11.2014 20:24

Цитата:

Сообщение от klk.pma (Сообщение 342237)
krutoy, а этот скрипт должен быть только после всех инпутов или его можно размещать в подключаемый файл?

Вообще, я думаю, все скрипты работающие с контентом лучше размещать в конце body. А подключаемый ли он из внешнего файла, или инлайн -- это, вроде, не особо важно. Он инициализируется в нужное время, все равно.

devote 21.11.2014 20:25

Цитата:

Сообщение от klk.pma
первый раз увидел такой перебор цикла for(i in digits)

Увидели, а теперь забудьте... Это очень плохая практика перебирать коллекции таким образом. А перед тем как перенять опыт, подумайте, может не зря этот человек krutoy, имеет в карме сплошной минус. А я поясню, ему еще самому многому надо поучиться перед тем как давать советы другим.

Памятка!
JavaScript хороший и динамичный язык, многое может делать разными вариантами в этом есть и плюсы и минусы. А минусы в том, что каждый день большая часть квалифицированных разработчиков бьются над производительностью кода. А подобные конструкции:
Цитата:

Сообщение от krutoy
for(i in digits){if(/\d+/.test(i)) digits[i].oninput=filter}

не ускоряют процесс а лишь затормаживают, во вторых этот подход сложно читаемый. Например вот этот код:
for(var index = digits.length; index--;) {
  digits[index].oninput=filter;
}
как минимум будет работать в 100 раз быстрее, намного приятнее и легко читается. Во вторых переменные нужно инициализировать, как можно меньше использовать регулярные выражения, особенно там где от них нет проку и т.д.

danik.js 21.11.2014 20:28

Цитата:

Сообщение от klk.pma
Кстати, первый раз увидел такой перебор цикла for(i in digits)

Он больной на голову, не используй такой перебор. В будущем будет for .. of ну а пока нужно использовать перебор по индексу.
Кстати что мешает применить скрипт к number типу? Я вот ща с мобилы - так мне клава числовая открылась. Я не могу туда букву ввести даже без скрипта.

krutoy 21.11.2014 20:31

devote,
ко-ко-ко. Над производительностью бьются мартышки. инженер пишет прототип и оптимизирует узкие места.

krutoy 21.11.2014 20:48

Цитата:

Сообщение от devote
как минимум будет работать в 100 раз быстрее

А заодно я солью тебя в говнецо, раз уж ты высунулся
<!DOCTYPE HTML>
<html>
  <head><meta charset="windows-1251" /> </head>
  <body>

<input class="digit" type="text" maxlength="8" name="ot" value="">
<input class="digit" type="text" maxlength="8" name="do" value="">

    <script>
get=function(){
  var el=document.createElement("input")
  el.setAttribute("class", "digit")
  document.body.appendChild(el)
}
count=1000
while(count--) get() 
digits=document.getElementsByClassName("digit")
func1=function(){alert(1)}
func2=function(){alert(2)}

console.time("for in")
for(i in digits){if(/\d+/.test(i)) digits[i].onkeyup=func1}
console.timeEnd("for in")

console.time("for")
for(var index = digits.length; index--;) {
  digits[index].oninput=func2;
}
console.timeEnd("for")

//FF:
//for in: timer started start_page.html:22
//for in: 0ms start_page.html:24
//for: timer started start_page.html:26
//for: 16ms
    </script>
  </body>
</html>

Другой, нижеотписавшийся "мастер" вообще не стоит внимания.

klk.pma 21.11.2014 20:50

Цитата:

Сообщение от danik.js (Сообщение 342242)
Он больной на голову, не используй такой перебор. В будущем будет for .. of ну а пока нужно использовать перебор по индексу.
Кстати что мешает применить скрипт к number типу? Я вот ща с мобилы - так мне клава числовая открылась. Я не могу туда букву ввести даже без скрипта.

Number не во всех браузерах работает

klk.pma 21.11.2014 20:52

Если представленный вариант неправильный, можете показать корректный вариант?

krutoy 21.11.2014 20:55

klk.pma,
Да не, они просто домохались до for in, якобы, он медленный (у дебилов он действительно может быть медленным, но в целом -- это гон, см тест выше), замени на for, если хочешь, и все.
<!DOCTYPE HTML>
<html>
  <head><meta charset="windows-1251" /> </head>
  <body>
 
<input class="digit" type="text" maxlength="8" name="ot" value="">
<input class="digit" type="text" maxlength="8" name="do" value="">
 
    <script>
digits=document.getElementsByClassName("digit")
filter=function () {
   if(/\D+/g.test(this.value)) this.value=this.value.replace(/\D+/g, "")
}

//for(i in digits){if(/\d+/.test(i)) digits[i].oninput=filter}


for(var i = digits.length; i--;) {
  digits[i].oninput=filter;
}
    </script>
  </body>
</html>

devote 21.11.2014 21:33

krutoy, я не знаю что у тебя за ФФ такой, который за никакое время умудряется выполнить код, но у меня результаты иные. Конечно про 100 раз я говорил образно, но как минимум в 2-4 раза точно быстрее..

Chrome:
for in: 4.000ms
for: 1.000ms

IE 11:
for in: 9.8345 мс
for: 5.8308 мс

FF:
for in: таймер запущен showhtml:21
for in: 5.17мс showhtml:23
for: таймер запущен showhtml:25
for: 2.53мс

Цитата:

Сообщение от krutoy
у дебилов он действительно может быть медленным, но в целом -- это гон, см тест выше

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

krutoy 21.11.2014 21:47

devote,
Я извиняюсь за резкие слова, но то слово относилось не к тебе лично, а к абстрактному дебилу в вакууме, как-бы, так что не принимай на свой личный счет.

Что касаемо for-in, мифы о его медлительности, как мне кажется, рождены из-за его кривого использования. Он итеритует объект вместе со всей цепочкой прототипов, поэтому, если вовремя не выйти из цикла, он будет заниматься перебором бесполезных полей. Его смело можно применять, как правило, если место не суперузкое, только с умом.


Часовой пояс GMT +3, время: 13:59.