Как заменить этот прослушиватель JQuery для панели вкладок с помощью чистого javascript? [Дубликат]

иногда «Моя переменная: $ {value}»;

20
задан Manju 20 January 2016 в 10:26
поделиться

6 ответов

Это связано с тем, что ваш элемент динамически создан, и вы должны делегирование событий обрабатывать событие.

 document.addEventListener('click',function(e){
    if(e.target && e.target.id== 'brnPrepend'){//do something}
 })

jquery упростить:

 $(document).on('click','#btnPrepend',function(){//do something})

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

36
ответ дан Liam 16 August 2018 в 05:27
поделиться
  • 1
    Спасибо! Иногда чистое решение JS не работает на iphone, но если файл изменений на каком-то другом родительском div, например, работает. Какое лучшее решение для делегации? – Kholiavko 10 May 2017 в 14:16
  • 2
    @ Холявко, я бы сказал, до тех пор, пока «родитель» элемент не создается динамически, он должен работать. Я бы связал обработчик события с первым родителем динамического элемента create d, чтобы не было конфликтов между различными обработчиками событий – jilykate 11 May 2017 в 07:47
  • 3
    Но иногда это не работает на iphone, даже «parent». элемент не создается динамически. Вот exapmle , он работает на всех браузерах, но не на iphone (сафари и даже хром). И я не понимаю, почему. – Kholiavko 11 May 2017 в 09:57
  • 4
    @ Kholiavko это просто потому, что codepen использует песочницу, чтобы обернуть все. Если вы действительно напишите этот код на обычной странице, он будет работать – jilykate 11 May 2017 в 13:04

Существует обходное решение путем захвата кликов на document.body, а затем проверки целевого объекта.

document.body.addEventListener( 'click', function ( event ) {
  if( event.srcElement.id == 'btnSubmit' ) {
    someFunc();
  };
} );
4
ответ дан Manasov Daniel 16 August 2018 в 05:27
поделиться
var __ = function(){
    this.context  = [];
    var self = this;
    this.selector = function( _elem, _sel ){
        return _elem.querySelectorAll( _sel );
    }
          this.on = function( _event, _element, _function ){
              this.context = self.selector( document, _element );
              document.addEventListener( _event, function(e){
                  var elem = e.target;
                  while ( elem != null ) {
                      if( "#"+elem.id == _element || self.isClass( elem, _element ) || self.elemEqal( elem ) ){
                          _function( e, elem );
                      }
                      elem = elem.parentElement;
                  }
              }, false );
     };

     this.isClass = function( _elem, _class ){
        var names = _elem.className.trim().split(" ");
        for( this.it = 0; this.it < names.length; this.it++ ){
            names[this.it] = "."+names[this.it];
        }
        return names.indexOf( _class ) != -1 ? true : false;
    };

    this.elemEqal = function( _elem ){
        var flg = false;
        for( this.it = 0; this.it < this.context.length;  this.it++ ){
            if( this.context[this.it] === _elem && !flg ){
                flg = true;
            }
        }
        return flg;
    };

}

    function _( _sel_string ){
        var new_selc = new __( _sel_string );
        return new_selc;
    }

Теперь вы можете зарегистрировать событие, например,

_( document ).on( "click", "#brnPrepend", function( _event, _element ){
      console.log( _event );
      console.log( _element );
      // Todo

  });

Поддержка браузера

chrome - 4.0, Edge - 9.0, Firefox - 3.5 Safari - 3.2, Opera - 10.0 и выше

0
ответ дан paranjothi 16 August 2018 в 05:27
поделиться

Вы можете сделать что-то похожее на это:

// Get the parent to attatch the element into
var parent = document.getElementsByTagName("ul")[0];

// Create element with random id
var element = document.createElement("li");
element.id = "li-"+Math.floor(Math.random()*9999);

// Add event listener
element.addEventListener("click", EVENT_FN);

// Add to parent
parent.appendChild(element);
1
ответ дан PRDeving 16 August 2018 в 05:27
поделиться

Вам нужно прикрепить событие после создания элемента. Например:

document.addEventListener('DOMContentLoaded', function() {
  document.getElementById('btnSubmit').addEventListener('click', function() {
    var name = document.getElementById('txtName').value;
    var mobile = document.getElementById('txtMobile').value;
    var html = '<ul>';
    for (i = 0; i < 5; i++) {
      html = html + '<li>' + name + i + '</li>';
    }
    html = html + '</ul>';

    html = html + '<input type="button" value="prepend" id="btnPrepend" />';
    document.getElementsByTagName('form')[0].insertAdjacentHTML('afterend', html);

    document.getElementById('btnPrepend').addEventListener('click', function() {
      var html = '<li>Prepending data</li>';
      document.getElementsByTagName('ul')[0].insertAdjacentHTML('afterbegin', html);
    });

  });
});
<form>
  <div class="control">
    <label>Name</label>
    <input id="txtName" name="txtName" type="text" />
  </div>
  <div class="control">
    <label>Mobile</label>
    <input id="txtMobile" type="text" />
  </div>
  <div class="control">
    <input id="btnSubmit" type="button" value="submit" />
  </div>
</form>

4
ответ дан R3tep 16 August 2018 в 05:27
поделиться
0
ответ дан Cristy 29 October 2018 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: