Як переконати мого шефа (та інших розробників) використовувати / вважати ненав’язливий JavaScript


21

Я досить нова в нашій команді девелепорсів.

Мені потрібні кілька вагомих аргументів та / або прикладів «підводних підводів», тому мій начальник нарешті зрозуміє переваги ненав’язливого JavaScript, щоб він та інша команда перестали робити такі дії:

<input type="button" class="bow-chicka-wow-wow" 
       onclick="send_some_ajax(); return false;" value="click me..." />

і

<script type="text/javascript">

function send_some_ajax()
{
  // bunch of code ... BUT using jQuery !!!
}
</script>

Я запропонував використовувати досить поширений зразок:

<button id="ajaxer" type="button">click me...</button>

і

<script type="text/javascript">

// since #ajaxer is also delivered via ajax, I bind events to document 
//  -> not the best practice but it's not the point....

$(document).on('click', '#ajaxer', function(ev) {
var $elem = $(this);
ev.preventDefault();

});

Причина, через яку мій начальник (та інші) не хочуть використовувати такий підхід, полягає в тому, що перевірка подій у FireBug (або інструментах Chrome Dev) вже не проста, наприклад з

<input type="text" name="somename" id="someid" onchange="performChange()">

він може відразу побачити, яка функція виконується на event-event і перейти до неї у величезний JS-файл, повний спагетті-коду .

У випадку ненав'язливого JavaScript єдине, що він бачив би:

<input type="text" name="somename" id="someid" />

і він не має уявлення, чи були пов'язані деякі події, якщо такі були, з цим елементом і яка функція буде запускатися.

Я шукав рішення і знайшов його:

$(document).data('events') // or .. $(document).data('events').click

але цей "підхід" змусив його зайняти "занадто довго ...", щоб з'ясувати, яка функція спрацьовує в якій події, тому мені сказали припинити зв'язувати подібні події.

Я прошу вас про кілька прикладів чи вагомих переваг чи будь-яких інших пропозицій щодо "Чому ми повинні використовувати UJS"

ОНОВЛЕННЯ: пропозиція "змінити роботу" не є ідеальним рішенням.

ОНОВЛЕННЯ 2: Гаразд, я не тільки запропонував використовувати jQuery прив'язку подій, я це зробив . Після того як я написав всю делегацію подій, бос підійшов до мене і запитав мене, чому я роблю делегацію подій з іншим підходом і підходом, який він не знає

Я згадав деякі очевидні переваги, як-от: Є 15 полів введення, і всі вони мають onchangeподію (не тільки деякі з них також onkeyup). Тому більш прагматично писати такий тип делегування подій для ВСІХ вхідних полів, замість того, щоб робити це 15 разів, особливо якщо весь HTML буде надано з відлунням PHPecho '... <input type="text" id="someid" ... />...'


"Класу" у вашій першій кодовій коробці, ймовірно, потрібен =.
Джо З.

6
Ви можете: 1) переконати свого начальника дозволити вам використовувати методи, які він не знає; 2) навчити свого начальника нових технік; 3) припиніть користуватися техніками, які ваш начальник не знає; або 4) змінити роботу. Я забув варіант? Якщо ви не хочете 4, і ви не можете досягти успіху в 1 і 2, ваш єдиний варіант, який залишився, - 3. Пам’ятайте, що ваша ринкова вартість залежить від того, що ви знаєте. Тож після того, як ви дізнаєтесь про все, що схвалює ваш шеф, ваші інші варіанти: 3A) припиніть навчання та спостерігайте за тим, як ваша ринкова ціна падає; 3В) вивчайте та використовуйте нові методики у вільний час. Варіант 3A коштує ваших грошей, варіант 3B коштує вам часу.
Viliam Búr

1
Я б застосував такий підхід, як це робить github: кожен елемент, який пов'язує події в JS, має js-this-class-do-somethingклас, так що ви можете легко CTRL + F для нього в коді.
caarlos0

FireQuery може допомогти з частиною "займає занадто довго". Не впевнений, наскільки добре він працює з подіями, але він повинен хоча б сказати вам, що елемент має події на ньому.
Ізката

1
Ось приємна утиліта, яку я люблю використовувати під час роботи з подіями
karka91

Відповіді:


49
  1. Перестаньте використовувати мовні слова та спробуйте робити замість цього вагомі аргументи. Навіть на сторінці Вікіпедії для ненав’язливого JavaScript вказується, що цей термін формально не визначений. Це може бути простим терміном для багатьох хороших ідей, але якщо це звучить як просто примха чи мода, ваш начальник та колеги не будуть приділяти багато уваги. Гірше, якщо ви будете продовжувати щось про те, що вони вважають марним, вони можуть почати знижувати абсолютно незв'язані ідеї, які ви пропагуєте.

  2. З’ясуйте, чому ви вважаєте, що ненав’язливі ідеї JavaScript важливі. Це тому, що ви читали, що вони вважаються найкращими методами? Чи стикалися ви з проблемами, які ви можете пояснити не дотриманням цих ідей? Наскільки вплив цих ідей вплине на суть компанії?

  3. Заходьте всередину голови свого начальника. Чому він робить так, як він робить, і чому він відхилив ваші зміни? Він, мабуть, не дурний, і він, мабуть, досвідченіший, ніж ви, тому, мабуть, є якісь вагомі причини для того, щоб робити речі своїм способом. Ви вже нагадали про деякі з них - дотримуйтесь цієї нитки до її кінця. Потім з’ясуйте, чи і як ваші пропозиції покращать те, що його найбільше хвилює.

  4. Підказка 1: Менеджерам подобаються гроші. Чим безпосередньо ви можете прив’язати свої пропозиції до збільшення доходу або зменшення витрат, тим більший вплив матиме ваш аргумент. Підказка 2: Час - це гроші. Підказка 3: естетична привабливість коду не дає грошей. Навпаки, насправді - потрібен час, щоб код виглядав приємно. Некрасивий код, який добре працює, добре підходить для більшості менеджерів.

  5. Не просто про це говори, роби це . Якщо вам пощастило, що маленький, самодостатній проект прийшов ваш шлях, попросіть свого менеджера, чи можете ви це зробити, використовуючи стиль "UJS" як своєрідну демонстрацію. Коли ви будете готові, проведіть огляд коду, де ви зможете пояснити, як це все працює і чому ви вважаєте, що це краще, ніж поточний стиль.

  6. Ідеалізм чудовий, але не дозволяйте йому заважати. Важливіше сприйматись як хтось, хто виконує справи, ніж як дилетант, який скаржиться на неповторний стиль кодування. Це особливо вірно, якщо ти новий хлопець. Якщо ви зараз не можете отримати тягу з UJS, замість цього зробіть добру роботу і повільно будуйте обробку для змін, які ви хотіли б внести, коли ви отримаєте авторитет.

  7. Прочитайте перемикач: Як змінити речі, коли зміни важкі . Це дасть вам набагато більше хороших ідей про те, як ефективно скласти свою справу.


Суть відповіді доводить, що ujs працює реально. Покажіть їм, що це працює.
OnesimusUnbound

2
@AvinashR Справа лише в тому, що те, що мотивує менеджерів, часто не те саме, що мотивує розробників. Ми, розробники, люблять код бути приємним і охайним, елегантно оформленим тощо. Менеджери хочуть отримати максимальний прибуток. Якщо ваша зміна призведе до збільшення продажів, чудово. Якщо це призведе до скорочення часу розробки або менше часу, витраченого на переробку чи виправлення помилок, чудово. Радий почути, що клієнтам подобається ваш графічний інтерфейс, але хіба бос приписує це UJS або тому, як виглядає GUI? Якщо клієнти дивляться на ваш код і кажуть "ми хочемо, щоб наш код виглядав так!" зробити свою справу слід легко.
Калеб

3
Окрім "Перемикача", я б також рекомендував "Водіння технічних змін" від Терранса Райана: terrenceryan.com/book . Також у "Привіт HTML5 та CSS3" Роб Кроутер просто викладає: "HTML для вмісту, CSS для презентації та JavaScript для поведінки". Зберігаючи JavaScript від HTML, ви можете створити бібліотеку поведінки та повторно використовувати HTML в усьому місці без зайвого кодування. Це, до точки Калеба №4, економить час і гроші.
Адріан Дж. Морено

2
Пункт 3: Не переоцінюйте досвід. Я б краще хотів, щоб у моїй команді був супер талановитий 22-річний Лео Мессі, а не 32-річний переплачений досвідчений лінивий випадковий гравець Прем'єр-ліги. Молода, свіжа, талановита кров часто дуже цінна.
Роберт Неєстрой

1
"Менеджери хочуть отримати максимальний прибуток". - менеджери також хочуть зменшити ризик; може бути інший проспект.
Роджер Ліпскомб

8

Що ви можете зробити, це надати їм демонстрацію налагодження html-файлу USJ за допомогою інструментів FireQuery , а також Chrome Query .

FireQuery - це розширення firebug і робить це досить непогано. Що стосується Chrome Query, я не можу поручитися на те, наскільки це добре, але його, безумовно, використовують деякі розробники ( публікація в stackoverflow ).

Також знайте, що .dataфункція видаляється для повернення внутрішніх даних про події, починаючи з jQuery 1.8.0 , і замінюється на $._data(element, "events")які може бути нестабільною, згідно з офіційним журналом змін

Тепер це видалено в 1.8, але ви все одно можете дістатися до даних про події з метою налагодження за допомогою $ ._ data (елемент, "події"). Зауважте, що це не підтримуваний публічний інтерфейс; фактичні структури даних можуть змінюватися несумісно від версії до версії.

ОНОВЛЕННЯ:
Коли я почав працювати, у мене була така ж дилема. Але, створивши демонстрацію з повністю функціональним графічним інтерфейсом (додаток для однієї сторінки), який включав в себе динамічно відкриваються вкладки (також закриваються), меню Акордеон (динамічно створюється з db), вони нарешті зрозуміли, що краще використовувати USJ повністю до кінця.

Також плюсом використання USJ є те, що ви можете мінімізувати всю свою програму в невеликий (нечитабельний) сценарій. Також покажіть їм сценарії для google.com / github.com (як приклад) та зазначте, що навіть у них стискається код, що завжди краще, оскільки глядачеві сайту буде важко розшифрувати недоліки безпеки. і використовувати їх, щоб розпочати повноцінну атаку на ваш сайт (налякати їх), хоч і малоймовірно.

ОНОВЛЕННЯ 2 :
До речі, я не знав, що роблю USJ, поки не побачив це питання, тож дякую одним способом.


2

Обробники вбудованих подій смердить, оскільки:

  • Немає делегування подій - що чудово, коли ви бажаєте динамічно видобувати елементи на сторінці та поза нею, не потребуючи повторного введення.

  • Ви пов'язуєте поведінку з тегами HTML, а не з атрибутами класу / ID тегів HTML. Скажімо, у вас є клас "combo_box" у всьому додатку. Раптом на половині старих сторінок ви хочете незначно змінити комбіновані поля, коли вони знаходяться в іншому контейнері. Прив’язаний до класу, ви можете змінити таку поведінку на основі контексту контейнера, наприклад"#special_container .combo_box" . Обмежившись всередині проклятого HTML, ви можете відслідковувати кожне невеличке поле з класом .combo_box на будь-яких сторінках із номером, щоб змінити посилання обробника по черзі, а не переробляти або писати пару нових рядків коду для фільтрації з одного файлового місця .

  • Якщо ви хочете отримати декілька обробників, ви об'єднали їх у функцію, а потім без потреби прив'язуєте їх до певних файлів HTML. Наскільки це ретельно?

  • Більш тонким моментом є те, що набагато простіше / більш рентабельним / гнучким та надійним керувати поведінкою з більшою ментальністю на панелі управління. Прив’язавшись до центрального місця, ви отримаєте місце, де ви зможете отримати огляд всієї поведінки, що відбувається на сторінці одночасно, що зручно, коли, наприклад, потрібно з’ясувати, чому періодично запускаються певні сторінки в певну помилку, яку важко зрозуміти, але не інші.

  • Це на стороні клієнта. У нас є кілька веб-переглядачів, які інтерпретують велику складність по-своєму. Складіть все разом і дозвольте IDE розібратися для вас, менталітет тут не працює добре. Зберігати свій код щільним, мінімальним, вільно з'єднаним та чистим - це не модно, це абсолютно важливо для того, щоб встановити ремонтопридатний передній кінець, який легко змінювати та оновлювати, і так, саме тут $$$ s припускають, що ваш менеджер насправді має передбачення .

  • Це вже ні! @ # $ Ing 2002. Цей аргумент старий як таблиці, так і макет. Займіться цим і почніть довіряти досвідченому спеціалісту, розробленому на стороні клієнта, якого ви самі найняли, оскільки вам бракувало їхньої експертизи (не те, що я спрямовую будь-який гнів із особистого досвіду чи чогось іншого).

І щоб спростувати аргумент вашого начальника, насправді не так важко відстежити, який клас або ідентифікатор використовується в делегуванні подій або обробці обробника з CTRL + F та інструментом, який дозволяє переглядати всі JS на сторінці, як мій особистий бентежно jquery / версія прототипу лише для закладок, я спішно зв'язався, коли на мене почали вилазити панелі інструментів веб-розробників (прокляте кольорове кодування). Закладка за посиланням на сторінці js скрипт або скопіюйте JS та зробіть своє.

Спільна посилання JS, яка, ймовірно, закінчиться з часом


+1 Нарешті хтось вказав на основні переваги вбудованого JS. Ці аргументи використаю в наступній дискусії з моїм начальником.
V-Light

@ V-Light Вони працювали?
Erik Reppen

2
ні! Варіант "ChangeYourOrganization" - це рішення
V-Light

0

Однією з головних переваг запропонованої методики є те, що ви повинні лише прив’язати обробник подій до батьківського типу, наприклад "документ", і цей обробник зможе зафіксувати події від усіх дітей, які задовольнили даний вибір, наприклад "button.anyclass ". Зберігає пам'ять і підтримується таким, що потрібен лише один екземпляр редагування, і він впливає на всі елементи.

Що стосується того, що не в змозі розпізнати одразу пов'язану функцію, ваша команда просто могла б стандартизувати спосіб декларування таких функцій, ймовірно, в нижній частині сторінки. Таким чином, ви всі знаєте, куди слід звернути увагу, також важливо назвати конвенцію іменування. Коменти можуть бути дуже корисними, але переконайтесь, що сервер його позбавлений, перш ніж подавати його як відповідь браузеру.

Крім того, якщо ви хочете надати притуплення та мінімізацію javascript для цілей безпеки, ваша техніка зробить це можливим, на відміну від старого стилю, який ваша команда все ще використовує.


-2

Очевидною відповіддю є те, що ви можете прив’язати до своєї кнопки лише одну функцію за допомогою атрибута onclick, тоді як подія JQuery дозволяє зв’язати кілька функцій. Поширена проблема з подією завантаження: якщо ваш документ складається з декількох файлів, часто виникають зіткнення.

Ще одне рішення, яке може задовольнити і вас, і вашого начальника, - це використання прив’язки даних із бібліотекою на кшталт Knockout або Angular, яка б відслідковувала зміни у вашому представленні та пригнічувала б потребу у значній частині обробників подій.


1
щодо нокаутів, кутових та інших рамок JS для крутих дітей ... на жаль, це не варіант. Причина така ж, як і вище ... це "занадто багато" або "занадто нове" або "занадто круто" або просто "ми не хочемо дізнаватися щось нове, давайте робити це по-старому (дурно / німо)". . "
V-Light

@Niphra: Крім того, ви можете прив'язати функцію лише до одного компонента.
Bruno Schäpper

3
@ V-Light: "Ви можете змінити свою організацію або змінити свою організацію." Можливо, це вам цікаво: jamesshore.com/Change-Diary
Bruno Schäpper

Привіт, моя компанія дотримується Classic ASP, оскільки ASP.NET "занадто новий", але мені все ж вдалося натиснути Knockout у нашому коді. Спробуйте побачити, що їх насправді викликає стурбованість, і дізнайтеся, чи можете ви внести зміни.
DistantEcho

1
@Niphra "моя компанія дотримується Classic ASP:" це .... жахливо.
Michael Paulukonis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.