Вызов события show.bs.modal перед родительским событием

У меня есть кнопка начальной загрузки (я использовал bootstrap 4), которая открывает модальное окно и передает данные, содержащиеся в кнопке, в форму в модальном окне с помощью функции:

$('#exampleModal').on('show.bs.modal', function (event).

кнопка находится в div (родительском). когда я нажимаю кнопку, родительское событие вызывается перед дочерним. Я не хочу, чтобы запускалось родительское событие. Мне нужно только модальное всплывающее окно, чтобы открыть. когда я пытаюсь открыть кнопку, сначала щелкнув ее вызов, но данные не передаются. это мой пример кода: codepen

это HTML

<div class="row">
  <div class="col-12 parent">
    I'm the parent!
    <div class="child">
      I'm the child
      <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal"       data-whatever="@mdo" data-message="@test message" >Open modal </button>

    </div>
  </div>
</div>



<!-- Bootstrap Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">New message</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        <form>
          <div class="form-group">
            <label for="recipient-name" class="form-control-label">Recipient:</label>
            <input type="text" class="form-control" id="recipient-name">
          </div>
          <div class="form-group">
            <label for="message-text" class="form-control-label">Message:</label>
            <textarea class="form-control" id="message-text"></textarea>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Send message</button>
      </div>
    </div>
  </div>
</div>

это сценарий

<script>
$(".parent").click(function(event){
  alert("Parent event");
})


/*
if I add this function I cant transfer the data that in the button
$(".child").click(function(event){
  alert("Child event");
  event.stopPropagation();
  $('#exampleModal').modal('show');
})*/



$('#exampleModal').on('show.bs.modal', function (event) {
  alert("btn event");
  var button = $(event.relatedTarget) // Button triggered the modal
  var recipient = button.data('whatever')
  var message = button.data('message') 
  var modal = $(this)
  modal.find('.modal-title').text('New message to ' + recipient)
  modal.find('.modal-body input').val(recipient)
  modal.find('.modal-body textarea').val(message)
})
</script>

person Esty Shlomovitz    schedule 21.06.2017    source источник


Ответы (1)


Довольно просто в родительском щелчке проверить, отличается ли target от button на data-target='#exampleModal' или нет, и все это с помощью . is () jquery, как показано ниже:

//get reference to the button 
var $button = $("button[data-target='#exampleModal']");
$(".parent").click(function(event){
  if (!$(event.target).is($button)) { // be sur button was'nt clicked
    alert("Parent event");
  }
})

Обновлено перо

См. Рабочий фрагмент ниже:

var $button = $("button[data-target='#exampleModal']");

$(".parent").click(function(event){
  if (!$(event.target).is($button)) {
    alert("Parent event");
  }
})



$('#exampleModal').on('show.bs.modal', function (event) {
  alert("btn event");
  var button = $(event.relatedTarget) // Button triggered the modal
  var recipient = button.data('whatever')
  var message = button.data('message') 
  var modal = $(this)
  modal.find('.modal-title').text('New message to ' + recipient)
  modal.find('.modal-body input').val(recipient)
  modal.find('.modal-body textarea').val(message)
})
body {
  background-color: #a3d5d3;
}

.col-12{ background:red; height:100px;}
.child{background:white;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>
<div class="row">
  <div class="col-12 parent">
    I'm the parent!
    <div class="child">
      I'm the child
      <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal"       data-whatever="@mdo" data-message="@test message" >Open modal </button>

    </div>
  </div>
</div>



<!-- Bootstrap Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">New message</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        <form>
          <div class="form-group">
            <label for="recipient-name" class="form-control-label">Recipient:</label>
            <input type="text" class="form-control" id="recipient-name">
          </div>
          <div class="form-group">
            <label for="message-text" class="form-control-label">Message:</label>
            <textarea class="form-control" id="message-text"></textarea>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Send message</button>
      </div>
    </div>
  </div>
</div>

person Spring    schedule 21.06.2017
comment
Не за что.. :) - person Guruprasad J Rao; 21.06.2017
comment
Спасибо за ответы, но моя проблема в том, что на моем сайте мне нужны все остальные дочерние элементы в родительском элементе, когда я нажимаю на них, родительский элемент работает. и в вашем решении это не работает ни для одного ребенка. Мне нужна функция родителя, работающего при щелчке всех остальных дочерних элементов. взгляните на мой пример кода. большое спасибо - person Esty Shlomovitz; 21.06.2017
comment
Добро пожаловать, @EstyShlomovitz, так что отметьте ответ как решенный ✓ (оставил ответ) :) - person Spring; 22.06.2017
comment
@bRIMOs Я сделал :) - person Esty Shlomovitz; 22.06.2017
comment
@EstyShlomovitz Спасибо :). - person Spring; 22.06.2017