Преобразование динамического элемента в clickeable


у меня есть следующий элемент в моем проекте:

introducir la descripción de la imagen aquí

индивидуальный код каждой коробки

<div class="col-md-3 col-sm-6 col-xs-12">
          <div class="info-box bg-aqua">
            <span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span>

            <div class="info-box-content">
              <span class="info-box-text">Caja</span>
              <span class="info-box-number">41,410</span>

              <div class="progress">
                <div class="progress-bar" style="width: 70%"></div>
              </div>
                  <span class="progress-description">
                    70% Increase in 30 Days
                  </span>
            </div>
            <!-- /.info-box-content -->
          </div>
          <!-- /.info-box -->
        </div>

дело в том, что я показываю его в зависимости от номера коробки, это может быть 1 или 1000, вопрос в том, что я хочу вернуть элемент clickeable как <a href=""> но он не направляет меня на какую-либо страницу, а делает мне действие, как это в зависимости от того, какая коробка clickeable:

$(".caja1").click(function() {
    console.log("Clickeo la caja # X");
});

Как я могу вернуть clickeable элемент и в то же время в javascript знать, что элемент clickee?

Большое спасибо за помощь.

отредактировано

код обновлен до ответы, но он ничего не бросает (влияет на то, что он динамично показывает их в работе .click()...?)

$("#buscarLote").click(function() {

    var valor = document.getElementById("loteBuscar").value;
    var totalCajas;
    var iter = [];
    $.ajax({
        url: "views/ajax/OIT.php",
        method: "GET",
        data: { funcion: "funcion6", box: valor },
        async: false,
        dataType: "json",
        success: function(respuesta) {
            totalCajas = respuesta.cantidadCajas;
            //console.log(respuesta.cantidadCajas);
            for (var i = totalCajas; i > 0; i--) {
                $(".contenedorCajas").append('<div class="col-md-3 col-sm-6 col-xs-12 cajas" id="' + (i - 1) + '"><div class="info-box bg-aqua"><span class="info-box-icon"><i class="fa fa-cube"></i></span><div class="info-box-content"><span class="info-box-text">Caja ' + (i - 1) + '</span><span class="info-box-number">41,410</span><div class="progress"><div class="progress-bar" style="width: 70%"></div></div><span class="progress-description">70% Increase in 30 Days</span></div><!-- /.info-box-content --></div><!-- /.info-box --></div>');
            }
        }
    });
});

$(".cajas").click(function() {
    console.log($(this.id));
});
Author: Baker1562, 2018-02-18

2 answers

Вы можете создать общий класс для всех ящиков и прослушать событие для этого класса. Затем событие дается, если, например, мы хотим название коробки мы используем find, чтобы найти класс .info-box-text то же самое будет работать для другого класса, который находится внутри коробки, как .info-box-number

Поскольку вы добавляете элементы в DOM, вы должны назначить listener элементу, который, если он существует в DOM, как в случае document. $(document).on('click','.caja',function() { ... }

$(document).on('click','.caja',function() {
    //$(this) hace referencia al div con la clase caja que se clickeo
    console.log($(this).find('.info-box-text').text());
    console.log($(this).find('.info-box-number').text());
    //Si desea obtener el id
    console.log("ID " + this.id);
    // Puede agrear más funcionalidad o acción a realizar
});
.caja{
  background : #ccc;
  margin :2em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<div class="col-md-3 col-sm-6 col-xs-12 caja"  id="caja1">
  <div class="info-box bg-aqua">
    <span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span>

    <div class="info-box-content">
      <span class="info-box-text">Caja 1</span>
      <span class="info-box-number">41,410</span>

      <div class="progress">
        <div class="progress-bar" style="width: 70%"></div>
      </div>
          <span class="progress-description">
            70% Increase in 30 Days
          </span>
    </div>
  </div>
</div>

<div class="col-md-3 col-sm-6 col-xs-12 caja" id="caja2">
  <div class="info-box bg-aqua">
    <span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span>

    <div class="info-box-content">
      <span class="info-box-text">Caja 2</span>
      <span class="info-box-number">42,110</span>

      <div class="progress">
        <div class="progress-bar" style="width: 70%"></div>
      </div>
          <span class="progress-description">
            70% Increase in 30 Days
          </span>
    </div>
  </div>
</div>

В моем примере я использую класс Box в единственном числе. я должен изменить это, так как в вашем отредактированном вопросе вы используете cajas

 4
Author: Dev. Joel, 2018-02-18 19:07:18

Вы можете добавить класс к каждому из ваших ящиков и, используя зарезервированное слово this, получить, например, идентификатор каждого ящика.

Зарезервированное слово this относится к элементу, с которым вы взаимодействуете каждый момент времени.

Получить значение при динамическом создании элементов - события delegate

Поскольку вы добавляете элементы динамически с помощью функции JQuery .append() вам нужно будет использовать событие delegate, которое можно создать с помощью функции .on() из JQuery.

Я укажу вам несколько фраз, взятых из собственной документации JQuery:

Обработчики событий привязаны только к выбранным в данный момент элементам; они должны существовать в тот момент, когда ваш код делает вызов. on().

Т. е. если бы мы сделали вызов метода JQuery .on(), как обычно (непосредственно в класс .caja), нам нужно будет добавить все элементы с помощью функции .append() перед вызовом метода .on().

Пример выполнения вызова метода .on() После добавления элементов:

$("#cajas").append("<div id='caja1' class='caja'></div>");
$("#cajas").append("<div id='caja2' class='caja'></div>");
$("#cajas").append("<div id='caja3' class='caja'></div>");

$(".caja").on('click', function(){
  console.log("Clickeo la caja: " + this.id);
});
.caja{
   display: inline-block;
   height: 200px;
   width: 200px;
   background-color: red;
   margin: 3px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="cajas"></div>

Пример выполнения вызова метода .on() Перед добавлением элементов:

$(".caja").on('click', function(){
  console.log("Clickeo la caja: " + this.id);
});

$("#cajas").append("<div id='caja1' class='caja'></div>");
$("#cajas").append("<div id='caja2' class='caja'></div>");
$("#cajas").append("<div id='caja3' class='caja'></div>");
.caja{
   display: inline-block;
   height: 200px;
   width: 200px;
   background-color: red;
   margin: 3px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="cajas"></div>

Как вы можете заметить, в этот второй пример, как упоминалось в документации, событие не может быть выброшено, когда элементы добавляются после вызова метода .on().

Для этого необходимо использовать события delegate. Согласно документации:

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

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

Чтобы создать событие delegate структура будет выглядеть так:

$(referencia a elemento padre).on('click', referencia a elemento hijo, function(){
    //Código aquí
});

Мы могли бы ссылаться на document в качестве родительского элемента, но я предпочел добавить контейнер в коробки, так как таким образом, если у вас были другие элементы с классом .caja за пределами этого контейнера, и вы не хотели добавление этого события к ним не будет применяться.

Я оставляю вам пример, применяя все вышеперечисленное:

$("#cajas").on('click', '.caja', function(){
  console.log("Clickeo la caja: " + this.id);
});

$("#cajas").append("<div id='caja1' class='caja'></div>");
$("#cajas").append("<div id='caja2' class='caja'></div>");
$("#cajas").append("<div id='caja3' class='caja'></div>");
.caja{
   display: inline-block;
   height: 200px;
   width: 200px;
   background-color: red;
   margin: 3px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="cajas"></div>
 2
Author: Francisco Romero, 2018-02-19 16:59:54