608 votes

Passer des données à une modale bootstrap

J'ai deux hyperliens auxquels est associé un identifiant. Lorsque je clique sur ce lien, je veux ouvrir une modale ( http://twitter.github.com/bootstrap/javascript.html#modals ), et transmettre cet ID à la modale. J'ai cherché sur google, mais je n'ai rien trouvé qui puisse m'aider.

Voici le code :

<a data-toggle="modal" data-id="@book.Id" title="Add this item" class="open-AddBookDialog"></a>

Qui devrait s'ouvrir :

<div class="modal hide" id="addBookDialog">
    <div class="modal-body">
        <input type="hidden" name="bookId" id="bookId" value=""/>
    </div>
</div>

Avec ce morceau de code :

$(document).ready(function () {
    $(".open-AddBookDialog").click(function () {
        $('#bookId').val($(this).data('id'));
        $('#addBookDialog').modal('show');
    });
});

Cependant, lorsque je clique sur l'hyperlien, rien ne se passe. Lorsque je donne à l'hyperlien <a href="#addBookDialog" ...> la modale s'ouvre bien, mais elle ne contient pas de données.

J'ai suivi cet exemple : Comment passer des arguments de valeurs à la fonction modal.show() dans Bootstrap

(et j'ai aussi essayé ceci : Comment définir la valeur d'entrée dans un dialogue modal ? )

0 votes

Nous devrions mettre à jour le code vers un code récent, avec bootstrap5 et avec du JS pur comme option en plus de jquery.

0 votes

Pouvez-vous passer le modèle entier sans Jquerey

599voto

mg1075 Points 6113

Je pense que vous pouvez le faire en utilisant la fonction de jQuery .on gestionnaire d'événements.

Vous pouvez tester cette méthode ; veillez à développer au maximum le cadre HTML de la méthode afin de pouvoir visualiser la modale.

http://jsfiddle.net/Au9tc/605/

HTML

<p>Link 1</p>
<a data-toggle="modal" data-id="ISBN564541" title="Add this item" class="open-AddBookDialog btn btn-primary" href="#addBookDialog">test</a>

<p>&nbsp;</p>

<p>Link 2</p>
<a data-toggle="modal" data-id="ISBN-001122" title="Add this item" class="open-AddBookDialog btn btn-primary" href="#addBookDialog">test</a>

<div class="modal hide" id="addBookDialog">
 <div class="modal-header">
    <button class="close" data-dismiss="modal">×</button>
    <h3>Modal header</h3>
  </div>
    <div class="modal-body">
        <p>some content</p>
        <input type="text" name="bookId" id="bookId" value=""/>
    </div>
</div>

JAVASCRIPT

$(document).on("click", ".open-AddBookDialog", function () {
     var myBookId = $(this).data('id');
     $(".modal-body #bookId").val( myBookId );
     // As pointed out in comments, 
     // it is unnecessary to have to manually call the modal.
     // $('#addBookDialog').modal('show');
});

5 votes

Cela fonctionne bien lorsque je n'ai qu'un seul hyperlien, mais j'ai plusieurs hyperliens, chacun avec son propre ID. J'ai ajouté un deuxième hyperlien avec un autre ID, mais la modale a toujours l'ID du premier hyperlien.

1 votes

@LeonCullens - J'ai mis à jour le violon et le code. Est-ce que cela fonctionne comme vous le souhaitez maintenant ?

2 votes

Bonne réponse - mais est-ce que le modal('show') nécessaire ? Il semble que le data-toggle="modal" sur les liens s'en chargerait.

427voto

LostInComputer Points 4851

Voici une manière plus propre de le faire si vous utilisez Bootstrap 3.2.0 .

Lien HTML

<a href="#my_modal" data-toggle="modal" data-book-id="my_id_value">Open Modal</a>

JavaScript modal

//triggered when modal is about to be shown
$('#my_modal').on('show.bs.modal', function(e) {

    //get data-id attribute of the clicked element
    var bookId = $(e.relatedTarget).data('book-id');

    //populate the textbox
    $(e.currentTarget).find('input[name="bookId"]').val(bookId);
});

http://jsfiddle.net/k7FC2/

1 votes

$(e.c

1 votes

@treblaluch e.currentTarget est l'élément cliqué, qui est extrait de l'événement de clic. e . Cette ligne trouve un input avec le nom bookId et lui attribue une valeur.

7 votes

Remplacement de $(this) con $(e.relatedTarget) fonctionne très bien

42voto

jhauraw Points 509

Voici comment je l'ai implémenté en travaillant à partir du code de @mg1075. Je voulais un code un peu plus générique afin de ne pas avoir à attribuer des classes aux liens/boutons de déclenchement de la modale :

Testé dans Twitter Bootstrap 3.0.3.

HTML

<a href="#" data-target="#my_modal" data-toggle="modal" data-id="my_id_value">Open Modal</a>

JAVASCRIPT

$(document).ready(function() {

  $('a[data-toggle=modal], button[data-toggle=modal]').click(function () {

    var data_id = '';

    if (typeof $(this).data('id') !== 'undefined') {

      data_id = $(this).data('id');
    }

    $('#my_element_id').val(data_id);
  })
});

4 votes

Vous pouvez utiliser !! $(this).data('id') au lieu de typeof $(this).data('id') !== 'undefined'

20voto

Kamil Kiełczewski Points 6496

Bootstrap 4.3 - utilisez le code ci-dessous - plus aquí

$('#exampleModal').on('show.bs.modal', function (event) {
  let bookId = $(event.relatedTarget).data('bookid') 
  $(this).find('.modal-body input').val(bookId)
})

a.btn.btn-primary.open-AddBookDialog {color: white }

<!-- Initialize Bootstrap 4 -->

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

<!-- BUTTON -->

<a 
  class="btn btn-primary open-AddBookDialog" 
  data-toggle="modal" 
  data-target="#exampleModal" 
  data-bookid="@book.Id" 
  title="Add this item"
>Open</a>

<!-- MODAL -->

<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">
    <div class="modal-content">

      <div class="modal-body">
        <input type="hidden" name="bookId" id="bookId" value=""/>
        <input type="text" class="form-control" id="recipient-name">    
      </div>

      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
      </div>

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

17voto

VTStampede Points 303

Si vous êtes sur bootstrap 3+, cela peut être raccourci un peu plus si vous utilisez Jquery.

HTML

<a href="#" data-target="#my_modal" data-toggle="modal" class="identifyingClass" data-id="my_id_value">Open Modal</a>

<div class="modal fade" id="my_modal" tabindex="-1" role="dialog" aria-labelledby="my_modalLabel">
<div class="modal-dialog" role="dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="myModalLabel">Modal Title</h4>
        </div>
        <div class="modal-body">
            Modal Body
            <input type="hidden" name="hiddenValue" id="hiddenValue" value="" />
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">No</button>
            <button type="button" class="btn btn-primary">Yes</button>
        </div>
    </div>
</div>

JQUERY

<script type="text/javascript">
    $(function () {
        $(".identifyingClass").click(function () {
            var my_id_value = $(this).data('id');
            $(".modal-body #hiddenValue").val(my_id_value);
        })
    });
</script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X