Je travaille sur une application de sondage utilisant Asp.net MVc. Mes événements dans jquery popup sont déclenchés plus d'une fois. Plus une popup est ouverte, plus elle se déclenche dans l'événement dans la popup. Quelle en est la raison. Chaque fois que les navigateurs sont ouverts, le fichier javascript temporaire qui commence par la VM est supprimé. Lorsque la fenêtre contextuelle est fermée, ces fichiers javascript virtuels ouverts ne sont pas détruits. Quelle en est la raison?
Ces événements incluent l'ajout de lignes à la table, la mise à jour et la suppression de lignes. Le fichier AddOrEdit.cshtml contient à la fois des composants d'écran et des codes javascript.
Images;
AddOrEdit.cshtml (Jquery Popup)
<script> $(document).ready(function () { $('[data-toggle="tooltip"]').tooltip(); //var actions = $("table.optionTable td:last-child").html(); var actions = ' <a class="add btn btn-primary btn-sm" title="Add" data-toggle="tooltip"><i class="fa fa-check">Onayla</i></a>' + '<a class="edit btn btn-secondary btn-sm" title="Edit" data-toggle="tooltip"><i class="fa fa-pencil">Güncelle</i></a>' + '<a class="delete btn-danger btn-sm" title="Delete" data-toggle="tooltip"><i class="fa fa-trash">Sil</i></a>'; // Append table with add row form on add new button click $(".add-new").click(function () { //RUNS MULTIPLE TIMES ON CHROME debugger; $(this).attr("disabled", "disabled"); $(".btnSubmit").attr("disabled", "disabled"); var index = $("table.optionTable tbody tr:last-child").index(); var row = '<tr>' + '<td style="display:none;">0</td>' + '<td><input type="text" class="form-control" name="optionName" id="optionName"></td>' + '<td>' + actions + '</td>' + '</tr>'; $("table.optionTable").append(row); $("table.optionTable tbody tr").eq(index + 1).find(".add, .edit").toggle(); $('[data-toggle="tooltip"]').tooltip(); }); // Add row on add button click $(".add").click(function () { //RUNS MULTIPLE TIMES ON CHROME debugger; var empty = false; var input = $(this).parents("tr").find('input[type="text"]'); input.each(function () { if (!$(this).val().trim()) { $(this).addClass("error"); empty = true; } else { $(this).removeClass("error"); } }); $(this).parents("tr").find(".error").first().focus(); if (!empty) { input.each(function () { $(this).parent("td").html($(this).val().trim()); }); $(this).parents("tr").find(".add, .edit").toggle(); $(".add-new").removeAttr("disabled"); $(".btnSubmit").removeAttr("disabled"); } }); // Edit row on edit button click $(".edit").click(function () { //RUNS MULTIPLE TIMES ON CHROME debugger; /*td: nth - child(2)*/ //$(this).parents("tr").find("td:nth-child(2)").each(function () { $(this).parents("tr").find("td:not(:first-child, :last-child)").each(function () { $(this).html('<input type="text" class="form-control" value="' + $(this).text() + '">'); }); $(this).parents("tr").find(".add, .edit").toggle(); $(".add-new").attr("disabled", "disabled"); $(".btnSubmit").attr("disabled", "disabled"); }); // Delete row on delete button click $(".delete").click(function () {//RUNS MULTIPLE TIMES ON CHROME debugger; $(this).parents("tr").remove(); $(".add-new").removeAttr("disabled"); var rowCount = $('table.optionTable tbody tr').length; if (rowCount > 0) { $(".btnSubmit").removeAttr("disabled"); } else { $(".btnSubmit").attr("disabled", "disabled"); } }); });
Jquery add , modifier, supprimer les événements de clic
@using MerinosSurvey.Models @model Questions @{ Layout = null; } @using (Html.BeginForm("AddOrEdit", "Question", FormMethod.Post, new { onsubmit = "return SubmitForm(this)", onreset = "return ResetForm(this)", id = "questionForm" })) { @Html.AntiForgeryToken() @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group row"> @Html.Label("QuestionId", "Soru No", new { @class = "col-form-label col-md-3" }) <div class="col-md-9"> @Html.TextBoxFor(model => model.QuestionId, new { @readonly = "readonly", @class = "form-control", }) </div> </div> <div class="form-group row"> @Html.Label("QuestionName", "Soru Adı", new { @class = "col-form-label col-md-3" }) <div class="col-md-9"> @Html.EditorFor(model => model.QuestionName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.QuestionName) </div> </div> <div class="form-group row"> <div class="col-md-9 offset-md-3"> <div class="custom-control custom-checkbox"> @Html.CheckBoxFor(m => m.IsOtherOptionRequired, new { @class = "custom-control-input ", id = "IsOtherOptionRequired", }) <label class="custom-control-label" for="IsOtherOptionRequired">DiÄer SeçeneÄi Eklensin mi? </label> </div> </div> </div> <br> <hr class="style14"> <br> @Html.ValidationMessageFor(model => model.Options) <div class="table-wrapper form-group table-responsive-md"> <div class="table-title"> <div class="form-group row"> <div class="col-md-9">Options</div> <div class="col-md-3"> <button type="button" class="btn btn-success add-new" style="margin-bottom: 10px"><i class="fa fa-plus"></i>Add Option</button> </div> </div> </div> <table class="table optionTable"> <thead class="thead-light"> <tr> <th style="display:none;" width="20%" scope="col">Seçenek Id</th> <th scope="col">Option Name</th> <th width="25%" scope="col">Update/Delete</th> </tr> </thead> <tbody> @foreach (Options options in Model.Options) { <tr> <td style="display:none;">@options.OptionId</td> <td>@options.OptionName</td> <td> <a class="add btn btn-primary btn-sm" title="Add" data-toggle="tooltip"> <i class="fa fa-check">Approve</i> </a> <a class="edit btn btn-secondary btn-sm" title="Edit" data-toggle="tooltip"> <i class="fa fa-pencil">Update</i> </a> <a class="delete btn-danger btn-sm" title="Delete" data-toggle="tooltip"> <i class="fa fa-trash">Delete</i> </a> </td> </tr> } </tbody> </table> </div> <div class="form-group row d-flex justify-content-end"> <button type="submit" class="btn btn-primary" style="margin-bottom: 10px; color: black"><i class="fa fa-save"></i>Kaydet</button> </div> }
3 Réponses :
Il semble que vous liez un événement plusieurs fois en utilisant le sélecteur de classe. Cela signifie qu'après avoir ajouté un nouveau DOM dans le document, liez un événement de clic sur les boutons d'action nouvellement ajoutés, mais il lie également l'événement de clic sur les boutons d'action existants.
Une coche si simple pour résoudre votre problème est que vous devez dissocier l'événement de clic existant et lier le nouveau une fois.
$(".add-new").unbind('click').bind('click', function(){ //your code here }); $(".add").unbind('click').bind('click', function(){ //your code here }); $(".edit").unbind('click').bind('click', function(){ //your code here }); $(".delete").unbind('click').bind('click', function(){ //your code here });
Vous pouvez utiliser les méthodes jQuery on / off pour gérer cela.
$(".add-new").off('click').on('click', function(){ });
Lorsque vous ouvrez une fenêtre contextuelle pour la deuxième fois, je pense que l'exécution de $ (". add-new"). length vous en renverra 2. Essayez de résoudre ce problème en premier, ce qui résoudra automatiquement votre problème d'événements.
Faites des changements tels que $ (". add-new"). length est toujours 1
Veuillez vous assurer que votre code publié est un exemple reproductible minimal . L'analyse de plus de 100 lignes de code empêchera les gens d'aider.
@evolutionxbox vous avez raison. J'ai édité ma question, voulez-vous m'aider?
Quelle ligne de code de ce qui précède est appelée plusieurs fois>? Pouvez-vous s'il vous plaît préciser spécifiquement
@NanditaSharma tous les événements sont déclenchés plusieurs fois. Par exemple, une fois que vous ouvrez le popup une fois, il n'y a pas de problème. Si vous fermez et rouvrez, tous les événements sont exécutés 2 fois. Après la fermeture et l'ouverture pour la troisième fois, tous les événements se déroulent 3 fois. En d'autres termes, le navigateur ouvre le code javascript dans AddOrEdit.cshtml comme une page comme VM6121 chaque popup. Comme vous le voyez sur l'image
Essayez de changer vos liaisons d'événement comme ceci $ (". Delete"). Off ('click'). On ('click', function () {}) Cela va d'abord dissocier l'événement de clic précédemment lié à la fenêtre contextuelle et lier un nouveau gestionnaire de clics
Dois-je utiliser $ (document) .ready (function () {})?
Je ne travaille pas avec asp.net, donc je ne sais pas pourquoi un nouveau code JS est inséré dans DOM à chaque fois que vous ouvrez une fenêtre contextuelle. Ce que je vous ai suggéré est juste une sécurité intégrée qui, je pense, devrait fonctionner pour vous. Peut-être que quelqu'un avec une meilleure connaissance de asp et js peut mieux vous guider
Le bouton d'ajout de nouveau en dehors de la table a fonctionné. Mais .add, .edit, .delete dans le tableau ne réagissent pas.
Êtes-vous en train de dire que le code javascript doit être dans un fichier externe.
Essayez de cette façon $ (document) .off ("click"). On ("click", ".delete", function () {// Votre code ici})
Selon moi, le code JS ne devrait se charger qu'une seule fois. D'après ce qui se passe dans votre code, il semble qu'un nouveau JS soit inséré dans le DOM à chaque ouverture de fenêtre contextuelle
Je vais essayer de l'ajouter dans l'écran parent.