Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   jQuery bind/on click или JavaScript onClick - что и в каких случаях лучше юзать (https://javascript.ru/forum/events/29595-jquery-bind-click-ili-javascript-onclick-chto-i-v-kakikh-sluchayakh-luchshe-yuzat.html)

IVAN86 04.07.2012 14:08

jQuery bind/on click или JavaScript onClick - что и в каких случаях лучше юзать
 
Добрый день всем!
Интересуют мнения по такому интересному вопросу:
Что же лучше/производительнее/удобнее и в каких ситуациях -
метод jQuery .on('click'...) или событие тега onClick="..."

ksa 04.07.2012 14:11

Цитата:

Сообщение от IVAN86
Что же лучше/производительнее/удобнее

В конечном счете все это одно и то же...

Deff 04.07.2012 14:43

IVAN86,
По скорости лучше onclick="Func()" прямо в теге

Но ежели скрипт пользовательский(от клиента) то в тег уже onclick="Func();" вряд ли установишь и так же проблемы при их оч большом кол-ве - разрастаецо объем передаваемой страницы. тады вышеуказанное ksa

IVAN86 04.07.2012 16:19

На самом деле далеко не одно и то же.
Если решать задачу "кликабельной таблицы" (~300 строк),
где при клике по строчке должна срабатывать функция,
то будет большая разница.

В одном случае много кода, в другом много событий за которыми следит метод .on
Кроме того, если таблица подгружается динамически.... тут начинается самое интересное...

Deff 04.07.2012 16:43

Цитата:

Сообщение от IVAN86
Кроме того, если таблица подгружается динамически.... тут начинается самое интересное...

Если таблица подгружается динамически, то либо live, либо on

bes 04.07.2012 18:59

Цитата:

Сообщение от IVAN86
Если решать задачу "кликабельной таблицы" (~300 строк),
где при клике по строчке должна срабатывать функция,
то будет большая разница.

Такие задачи решаются установкой одного обработчика на родительский контейнер (в данном случае таблицу), цель (target || srcElement) определяется при наступлении события (одного onclick достаточно).
Я думаю, принцип такой - где можно обойтись без jq, нужно обойтись без jq.

cyber 04.07.2012 19:18

самый лучший вариант добавление обработчика это
addEventListener

cyber 04.07.2012 19:46

кстати проводил свое исследование по этой теме , какой самый быстрый способ добавить обработчик (может для профи примитивно , для новичков пойдет)
http://www.html.by/threads/25995-ben...mentam-v-cikle

ksa 05.07.2012 08:40

Цитата:

Сообщение от IVAN86
тут начинается самое интересное...

Что именно?
Один вариант клика сработает мгновенно, а другой будет срабатывать через полчаса?

IVAN86 05.07.2012 09:49

Цитата:

Сообщение от Deff
Если таблица подгружается динамически, то либо live, либо on

К слову, live - давно устаревший метод, его замена on.

IVAN86 05.07.2012 09:52

Цитата:

Сообщение от bes
Такие задачи решаются установкой одного обработчика на родительский контейнер

Задача усложняется если не только строки в таблице, но и сами таблицы могут быть динамическими, и появляться в разных местах страницы.
В таком случае нужно привязывать on к body, а это, думаю, затратно.

IVAN86 05.07.2012 10:08

Цитата:

Сообщение от ksa
Что именно?
Один вариант клика сработает мгновенно, а другой будет срабатывать через полчаса?

Весь вопрос в том, во сколько раз тяжелее метод on

bes 05.07.2012 11:10

Цитата:

Сообщение от IVAN86
Задача усложняется если не только строки в таблице, но и сами таблицы могут быть динамическими, и появляться в разных местах страницы.
В таком случае нужно привязывать on к body, а это, думаю, затратно.

Тоже вроде не проблема
<style>
  td {border: solid 1px; cursor: pointer}
</style>

<body>
<button id="but">create table</button>

<script>
window.onload = function () {
  var str = '<table>';
    for (var i = 0; i < 10; i++) {
      str += '<tr>';
      for (var j = 0; j < 10; j++) {
        str += '<td>' + i + j + '</td>';
      }
      str += '</tr>';
    }
    str += '</table><br>';

  document.body.onclick = function (e) {
    e = e || event;
    var target = e.target || e.srcElement;
    if (target.id == 'but') {
      document.body.innerHTML += str; 
    } else if (target.tagName == 'TD') {
      alert(target.innerHTML) 
    }
  }

}
</script>

IVAN86 05.07.2012 11:20

Цитата:

Сообщение от bes
Тоже вроде не проблема

Интересное решение.
А если в таблице появятся ссылки и input-ы, как быть?

ksa 05.07.2012 11:23

Цитата:

Сообщение от IVAN86
Весь вопрос в том, во сколько раз тяжелее метод on

Он не тяжелый... :)
Никто особо не вспотеет при его использовании.

bes 05.07.2012 11:25

Цитата:

Сообщение от IVAN86
А если в таблице появятся ссылки и input-ы, как быть?

Приведите пример, в котором у вас не получается применить данный метод.

ksa 05.07.2012 11:40

Да это как в анекдоте:

На выпуске агентов по защите авиалиний от терористов...
- Представьте, что вы в лайнере где 500 пассажиров и есть один терорист с бомбой... Ваши действия?
- Я путем тестов, которым обучался, вычислю того терориста и нейтрализую.
- Хорошо... Усложним задачу. У того терориста есть сообщник с еще одной бомбой!
- Так же используя тесты, вычислю обоих... Дождусь пока один отвлечется, устраню другого, а потом и первого.
- Хорошо... А если у терористов будут свои люди в салоне? И у них тоже будут бомбы?
- Я не совсем понимаю... Вы сами-то за кого?

IVAN86 05.07.2012 12:28

Цитата:

Сообщение от ksa
На выпуске агентов по защите авиалиний от терористов...

:lol: Примерно как в анекдоте.
Но, всё же, я думаю, код не будет работать как надо в этом примере:

Код:


<style>
  td {border: solid 1px; cursor: pointer}
</style>


<body>
<button id="but">create table</button>


<script>
window.onload = function () {
  var str = '<table>';
    for (var i = 0; i < 10; i++) {
      str += '<tr>';
      for (var j = 0; j < 10; j++) {
        str += '<td><input type="checkbox" /> ' + i + j + '</td>';
      }
      str += '</tr>';
    }
    str += '</table><br>';

  document.body.onclick = function (e) {
    e = e || event;
    var target = e.target || e.srcElement;
    if (target.id == 'but') {
      document.body.innerHTML += str; 
    } else if (target.tagName == 'TD') {
      alert(target.innerHTML) 
    }
  }

}
</script>


bes 05.07.2012 12:49

<style>
  td {border: solid 1px; cursor: pointer}
</style>

<body>
<button id="but">create table</button>

<script>
window.onload = function () {
  var str = '<table>';
    for (var i = 0; i < 10; i++) {
      str += '<tr>';
      for (var j = 0; j < 10; j++) {
        str += '<td><input type="checkbox" /> ' + i + j + '</td>';
      }
      str += '</tr>';
    }
    str += '</table><br>';

  document.body.onclick = function (e) {
    e = e || event;
    var target = e.target || e.srcElement;
    if (target.id == 'but') {
      document.body.innerHTML += str; 
    } else if (target.tagName == 'TD') {
      alert(target.children[0].checked + '; ' + target.innerText || target.textContent);
     //в FF только textContent, в IE только innerText
    }
  }

}
</script>

IVAN86 05.07.2012 13:18

bes - Хорошее решение!

Я решил эту задачу на JQ таким образом:
$("body").on("click", "tr", function(){ alert(1); })
  .on({
	"mouseenter": function(){ $("body").off("click", "tr"); },
	"mouseleave": function(){ $("body").on("click", "tr", function(){ alert(1); }); },
  }, ".tr input, .tr a");


Вопрос на сколько это сильно грузит браузер остаётся открыт.

bes 05.07.2012 14:18

Думаю не сильно
<style>
  td {border: solid 1px; cursor: pointer}
</style>

<body>
<button id="but">create table</button>

<script>
window.onload = function () {
  var str = '<table>';
    for (var i = 0; i < 10; i++) {
      str += '<tr>';
      for (var j = 0; j < 10; j++) {
        str += '<td><input type="checkbox" /> ' + i + j + '</td>';
      }
      str += '</tr>';
    }
    str += '</table><br>';

  document.body.onclick = function (e) {
    d = new Date();
    e = e || event;
    var target = e.target || e.srcElement;
    if (target.id == 'but') {
      document.body.innerHTML += str;
      document.body.innerHTML += 'время: ' + (new Date() - d) + '; '; 
    } else if (target.tagName == 'TD') {
       document.body.innerHTML += (target.children[0].checked + '; ' + (target.innerText || target.textContent) + '; время: ');
       document.body.innerHTML += (new Date() - d)  + '; '; 
    }
  }

}
</script>

IVAN86 06.07.2012 08:31

Цитата:

Сообщение от bes
Думаю не сильно

Действительно на ПК обработка клика по одной из 1000 строк заняла 48мс - не заметно для пользователя.
Однако, ту же операцию КПК выполнил за 1.5с, что уже существенно.

Теперь есть над чем подумать, и из чего выбирать.


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