За последние 24 часа нас посетили 22298 программистов и 1166 роботов. Сейчас ищет 751 программист ...

обработчик событий внутри плагина на Jquery

Тема в разделе "JavaScript и AJAX", создана пользователем Arhitec, 19 сен 2018.

Метки:
  1. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Уперся, как мне кажется, достаточно в простую задачу. Но решить сам не могу. Хочу реализовать плагин, заменяющий стандартный вид формы. Сложность в том, что не могу реализовать фокус на div, обертывающий форму, когда срабатывает фокус на самой форме.

    Код формы:
    HTML:
    1. <input type="text" id="input_01">
    Вызываю плагин:
    Код (Javascript):
    1. $('#input_01').awFormLogin
    2. ({
    3.     'width' :       150,
    4.     'classblock' :  'aw-frm-bd-fs-restrain aw-frm-so-fs-restrain',
    5.     'classinput' :  ''
    6. });
    Код самого плагина:
    Код (Javascript):
    1. (function($)
    2. {
    3.     $.fn.awFormLogin = function(options)
    4.     {
    5.         var settings =
    6.         {
    7.           'width' : 100, // ширина
    8.           'classblock' : '',
    9.           'classinput': ''
    10.         };
    11.  
    12.         return this.each(function()
    13.         {  
    14.             if (options)
    15.             {
    16.                 $.extend(settings, options);
    17.  
    18.             // Определяем id изменяемого элемента
    19.             var idElement = $(this).attr('id');
    20.             console.log(idElement);
    21.  
    22.             // Размер поля INPUT
    23.             var widthInput = Math.round(options.width - 62);
    24.  
    25.             // Выводим новый вид формы
    26.             $(this).replaceWith('<div tabindex="0" class="aw-frm-default-wrapp ' + options.classblock +'" style="width: ' + options.width +'px;"><div class="aw-frm-btn-login"></div><div class="aw-frm-input-wrapp"><input type="text" id="' + idElement + '" class="aw-frm-default aw-frm-default-none ' + options.classinput +'" style="width: ' + widthInput +'px;"></div></div>');
    27.             return this;
    28.         });
    29.     };
    30. })( jQuery );
    Если на странице с формой разместить код:
    Код (Javascript):
    1. $('input').focus(function()
    2. {
    3.     if($(this).parent().parent().attr('tabindex', 0))
    4.     {
    5.         $(this).parent().parent().focus();
    6.     }
    7. });
    То все заработает как мне нужно.
    Но как реализовать функцию фокуса внутри плагина? Буду благодарен за помощь.
     
  2. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Что бы не городить парент парент парент и т.д т.к вложенность может быть больше или меньше то лучше использовать всплытие события.
    Вешаешь обработчик focus например на document, внутри него проверяешь e.target на соответствие тэгу, классу и любому другому атрибуту и если условие удовлетворено то исполняешь ту часть кода которая необходима.

    В случае всплытия события this будет тем элементом на которым было событие а в event сомов всплытие.
     
  3. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Вот честно, прочитал твой ответ раз 10, кое-что понял :))) И наверное это уже хорошо :)
    Вопросы:
    1. Про городить парент парент - что значит использовать всплытие события?
    2. Последнюю строчку тоже не врубился... Если не затруднит, может како-нить примерчик простенький? Я вроде не тупой, но туплю :)
     
  4. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Ну всплытие события работает примерно следующим образом. Есть разметка

    document
    header
    nav
    a

    Клик по А генерирует событие клик и оно после этого не уходит не куда, можно сказать не помирает. А поднимается выше, с А на NAV, с нав на хедер, с хедера на документ. Тем самым событие произошедшее на любом вложенном документе мы можем отследить на любом родительском элементе.

    Как то так моими словами :))

    Ещё фича в том что событие реально генерируется с документами и.е сверху в низ :))

    Сорри с телефона :)
     
    Arhitec нравится это.
  5. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    На самом важное замечание, спасибо! Сорри за тугость, но как это работает в плагине?
    Например, если в плаг добавить код:

    Код (Javascript):
    1. $(this).focus(function()
    2. {
    3. console.log('Сработало!');
    4. });
    То ничего не происходит... Я перепробовал море вариантов и с .bind, .trigger и т.п. Ничего не получается. Перекопал множество статей. Но ничего не помогает :(
     
  6. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Код (Javascript):
    1. {
    2. ...,
    3. events: {
    4.   focus: function(elem) {}
    5. }
    6. }
    При инициализации плагина вешай опбработчик
     
    Arhitec нравится это.
  7. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Мне уж и неловко писать одно и тоже :(
    Инициализация плагина это здесь:
    Код (Javascript):
    1. $('#input_01').awFormLogin
    2. ({
    3.     'width' :        150,
    4.     'classblock' :    'aw-frm-bd-fs-restrain aw-frm-so-fs-restrain',
    5.     'classinput' :    ''
    6. });
    Или здесь:
    Код (Javascript):
    1. (function($)
    2. {
    3.     $.fn.awFormLogin = function(options)
    4.     {...
    И в том и в другом случае не понимаю как вписать events. Дружище, ну уж сорри за тугость мою :)
     
  8. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Строка 14, обработка переданных параметров
     
  9. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Увы, у меня ничего не выходит :(
    Все просто потому, что я не знаю основы синтаксиса...
    В любом случае большое спасибо!
     
  10. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Arhitec нравится это.
  11. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Косяк и забыл что исключение есть :) ну влюбом случае можно циклом или рекурсией подняться до родительского элемента и не городить parent на parent
     
  12. Arhitec

    Arhitec Новичок

    С нами с:
    13 июл 2016
    Сообщения:
    43
    Симпатии:
    1
    Спасибо за статью, очень полезные данные для меня! Буду вникать. Как понял, фокус - это исключение из правил.