2016-10-04 1 views
3

Ich habe eine Tabelle mit einer Spalte, die 2 Schaltflächen hat, bearbeiten und deaktivieren. Beide funktionieren perfekt. Ich habe jedoch auch eine Schaltfläche außerhalb der Tabelle, die eine Zeile zur Tabelle hinzufügt. Bei allen hinzugefügten Zeilen funktioniert weder meine Schaltfläche zum Bearbeiten noch Deaktivieren. Wie behebe ich das?Schaltflächen funktionieren nicht beim Hinzufügen von Tabellenzeilen

HTML/PHP:

<table id="html_master"> 
<thead> 
    <tr> 
    <td>ID</td> 
    <td>Vendor</td> 
    <td>Buyer ID</td> 
    <td>POC Name</td> 
    <td>POC Email</td> 
    <td>POC Phone</td> 
    <td>Edit/Delete</td> 
    </tr> 
</thead> 
<tbody> 

<?php 
    foreach ($dbh->query($sql) as $rows){ 
    ?> 
    <tr> 
     <td class="mr_id" contenteditable="false"><?php echo intval ($rows['MR_ID'])?></td> 
     <td class="mr_name" contenteditable="false"><?php echo $rows['MR_Name']?></td> 
     <td class="buyer_id" contenteditable="false"><?php echo $rows['Buyer_ID']?></td> 
     <td class="poc_n" contenteditable="false"><?php echo $rows['MR_POC_N']?></td>  
     <td class="poc_e" contenteditable="false"><?php echo $rows['MR_POC_E']?></td> 
     <td class="poc_p" contenteditable="false"><?php echo $rows['MR_POC_P']?></td> 
     <td><button class="edit" name="edit">Edit</button> 
     <button class="deactivate" name="deactivate">Deactivate</button></td> 
    </tr> 
<?php 
    } 
?> 
</tbody> 
     <br> 
     <input type="button" class="add" value="Add Row" onclick="addRow('html_master')"> 
</table> 

JavaScript:

// ----- Deactivate Row ----- 

$(document).ready(function() { 
    $('.deactivate').click(function() { 
    var $this = $(this); 
    var $tr = $this.closest('tr'); 
    var action = $tr.hasClass('deactivated') ? 'activate' : 'deactivate'; 

    if (confirm('Are you sure you want to ' + action + ' this entry?')) { 
     $tr.toggleClass('deactivated'); 
     $this.text(function(i, t) { 
     return t == 'Deactivate' ? 'Activate' : 'Deactivate'; 
     }); 
    } 
    }) 
}); 

// ----- Add Row ----- 

function addRow(tableID) { 

    var table = document.getElementById(tableID); 

    var rowCount = table.rows.length; 
    var row = table.insertRow(rowCount); 

    var cell1 = row.insertCell(0); 
    cell1.innerHTML = rowCount; 

    var cell2 = row.insertCell(1); 
    var element2 = document.createElement("input"); 
    element2.type = "text"; 
    element2.name = "txtbox[]"; 
    cell2.appendChild(element2); 

    var cell3 = row.insertCell(2); 
    var element3 = document.createElement("input"); 
    element3.type = "text"; 
    element3.name = "txtbox[]"; 
    cell3.appendChild(element3); 

    var cell4 = row.insertCell(3); 
    var element4 = document.createElement("input"); 
    element4.type = "text"; 
    element4.name = "txtbox[]"; 
    cell4.appendChild(element4); 

    var cell5 = row.insertCell(4); 
    var element5 = document.createElement("input"); 
    element5.type = "text"; 
    element5.name = "txtbox[]"; 
    cell5.appendChild(element5); 

    var cell6 = row.insertCell(5); 
    var element6 = document.createElement("input"); 
    element6.type = "text"; 
    element6.name = "txtbox[]"; 
    cell6.appendChild(element6); 

    var cell7 = row.insertCell(6); 
    var element7 = document.createElement("input"); 
    var element8 = document.createElement("input"); 
    element7.type = "button"; 
    element8.type = "button"; 
    element7.name="edit"; 
    element8.name="deactivate"; 
    element7.value="Edit"; 
    element8.value="Deactivate"; 
    cell7.appendChild(element7); 
    cell7.appendChild(element8); 
} 

$(document).ready(function() { 
    $('.edit').click(function() { 
     var $this = $(this); 
     var tds = $this.closest('tr').find('td').not('.mr_id').filter(function() { 
     return $(this).find('.edit').length === 0; 
    }); 
    if ($this.html() === 'Edit') { 
     $this.html('Save'); 
     tds.prop('contenteditable', true); 
    } else { 
     var isValid = true; 
     var errors = ''; 
     $('#myDialogBox').empty(); 
     tds.each(function(){ 
      var type = $(this).attr('class'); 
      var value = $(this).text(); 
      switch(type){ 
       case "buyer_id": 
        if(!$.isNumeric(value)){ 
         isValid = false; 
         errors += "Please enter a valid Buyer ID\n"; 
         } 
        break; 
       case "poc_n": 
        if(value == value.match(/^[a-zA-Z\s]+$/)){ 
         break; 
        } 
        else { 
         isValid = false; 
         errors += "Please enter a valid Name\n"; 
        } 
        break; 
       case "poc_e": 
        if(value == value.match(/^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/)){ 
         break; 
        } 
        else { 
         isValid = false; 
         errors += "Please enter a valid Email\n"; 
        } 
        break; 
       case "poc_p": 
        if(value == value.match('^[0-9()+/-]{10,}$')){ 
         break; 
        } 
        else { 
         isValid = false; 
         errors += "Please enter a valid Phone Number\n";  
        } 
        break; 
      } 
     }) 
     if(isValid){ 
      $this.html('Edit'); 
      tds.prop('contenteditable', false); 
     }else{ 
      alert(errors); 
     } 
    } 
}); 
}); 
+1

prüfen dies: http://stackoverflow.com/questions/29086585/button-jquery-onclick-works -only-once – KatharaDarko

+0

Funktioniert die erste Reihe oder nicht einmal diese? Wenn die erste Zeile funktioniert, überprüfen Sie meine Antwort;) – KatharaDarko

+0

Ja, alles funktioniert, außer für zusätzliche Zeilen – Rataiczak24

Antwort

2

Die dynamisch hinzugefügten Schaltflächen sind an nichts gebunden.

Die Lösung ist Ihre onload Bindungen eine Funktion zu machen, die Sie jederzeit anrufen können ...

function bindDeactivate() { 
    $('.deactivate').click(function() { 
    var $this = $(this); 
    var $tr = $this.closest('tr'); 
    var action = $tr.hasClass('deactivated') ? 'activate' : 'deactivate'; 

    if (confirm('Are you sure you want to ' + action + ' this entry?')) { 
     $tr.toggleClass('deactivated'); 
     $this.text(function(i, t) { 
     return t == 'Deactivate' ? 'Activate' : 'Deactivate'; 
     }); 
    } 
    }); 
} 

Binden Sie die Taste auf Last.

$(document).ready(function() { 
    // Bind the deactivate button click to the function 
    bindDeactivate(); 
}); 

Am Ende der Zeile Zeile hinzufügen, binden Sie die Schaltfläche.

function addRow(tableID) { 
    // Skipped a couple lines... 

    cell7.appendChild(element7); 
    cell7.appendChild(element8); 

    // Bind this new deactivate button click to the function 
    bindDeactivate(); 
} 

Sie das gleiche gilt für die Schaltfläche Bearbeiten der Lage zu tun ...
;)

EDIT

Sie haben ein anderes Problem.
Ihre dynamisch hinzugefügte Schaltfläche enthält KEINE zugeordneten Klassen.

Fügen Sie diese Option zu Ihrer function addRow(tableID) hinzu, um eine Klasse zur Schaltfläche Deaktivieren hinzuzufügen.

var setClass = document.createAttribute("class"); 
setClass.value = "deactivate"; 
element8.setAttributeNode(setClass); 

Machen Sie dasselbe für die Bearbeitungsschaltfläche.

Siehe meine CodePen here.

EDIT

Okay ... Ein weiteres Problem, das Sie hatte:
In Ihrer ersten HTML, die Tasten sind <button> Tags.
Während die dynamisch hinzugekommenen <input type="button">

sind Arbeits Dies bewirkt, dass $this.text(function(i, t) { werden nicht auf dem <input type="button">.

Ich habe sie für <input type="button"> in Ihrem HTML geändert.
Und $this.text(function(i, t) { für $this.val(function(i, t) {

änderte es verbesserte auch den „Doppelklick-Effekt“ durch unbinding vor dem Wieder binden ... Am Ende der addRow(tableID) Funktion.

// Bind this new deactivate button click to the function 
$('#html_master').off("click",'.deactivate'); 
bindDeactivate(); 

Bitte, überprüfen Sie meine codePen wieder
Es arbeitet jetzt (nur für deaktivieren/aktivieren Taste)
Sie können die gleiche Logik für die Schaltfläche Bearbeiten anwenden ...
;)

+0

Also der Code zum Binden der Schaltfläche beim Laden ... wohin genau geht das? Und für das Hinzufügen des Codes am Ende der Zeile hinzufügen Funktion .... Ich stelle dies in der Funktion, aber am Ende richtig? – Rataiczak24

+0

Richtig für «innerhalb der Funktion, aber am Ende». Für das Onload ... Es steht in einem Dokument bereit ... also ist überall gut. –

+0

Ich kann es nicht funktionieren lassen – Rataiczak24

0

Bocz Sie binden Ereignis auf Last, so dass es für die bestehenden Datenreihe arbeiten, aber neu hinzugefügte Zeile jede Bindung nicht haben, versuchen Sie unter Code Ereignis binden

<td><button class="edit" id="edit" name="edit">Edit</button> 
     <button class="deactivate" id="deactivate" name="deactivate">Deactivate</button></td> 

Und in der jQuery, ersetzen Sie die ".edit":

$(document).on('click','.deactivate',function() { 
var $this = $(this); 
var $tr = $this.closest('tr'); 
var action = $tr.hasClass('deactivated') ? 'activate' : 'deactivate'; 

if (confirm('Are you sure you want to ' + action + ' this entry?')) { 
    $tr.toggleClass('deactivated'); 
    $this.text(function(i, t) { 
    return t == 'Deactivate' ? 'Activate' : 'Deactivate'; 
    }); 
} 
}); 

und bearbeiten

$(document).on('click','.edit',function() { 
    var $this = $(this); 
    var tds = $this.closest('tr').find('td').not('.mr_id').filter(function() { 
    return $(this).find('.edit').length === 0; 
}); 
}); 
+0

Ich habe beide Sätze von Code in mein Skript und es scheint nicht zu funktionieren. Die Zeile hinzufügen-Funktion wird jetzt nicht einmal funktionieren. – Rataiczak24

+0

Überprüfen Sie die schließenden Klammern. wie ich nur hinter deinem Code kopiere. Ich verpasste Klammer im Bearbeitungscode zu schließen. – Veer

-1

versuchen, eine id statt der Klasse dergleichen zu verwenden mit "#edit" und ".deactivate" mit "#deactivate".

+0

das funktioniert nicht ... ID ist spezifisch für ein Element .... Ich habe mehrere Zeilen, also bin ich ziemlich sicher, dass CLASS hier verwendet werden muss – Rataiczak24

+0

Vielleicht können Sie versuchen, den onclick auf den HTML-Button zu verwenden und es zu verwenden eine Funktion in jQuery aufrufen? Nur eine Schätzung – KatharaDarko

+2

auf einer Seite alle emement muss eine eindeutige ID haben. dann hat nur jquery die Auswahl des eleent verstanden, sonst wählt es immer ein (erstes) ID-Element aus. – Veer

0

Verwendung Code

$(document).on('click','.deactivate',function() { 
var $this = $(this); 
var $tr = $this.closest('tr'); 
var action = $tr.hasClass('deactivated') ? 'activate' : 'deactivate'; 

if (confirm('Are you sure you want to ' + action + ' this entry?')) { 
    $tr.toggleClass('deactivated'); 
    $this.text(function(i, t) { 
    return t == 'Deactivate' ? 'Activate' : 'Deactivate'; 
    }); 
} 
}); 

$(document).on('click','.edit',function() { 
    var $this = $(this); 
    var tds = $this.closest('tr').find('td').not('.mr_id').filter(function() { 
    return $(this).find('.edit').length === 0; 
}); 
if ($this.html() === 'Edit') { 
    $this.html('Save'); 
    tds.prop('contenteditable', true); 
} else { 
    var isValid = true; 
    var errors = ''; 
    $('#myDialogBox').empty(); 
    tds.each(function(){ 
     var type = $(this).attr('class'); 
     var value = $(this).text(); 
     switch(type){ 
      case "buyer_id": 
       if(!$.isNumeric(value)){ 
        isValid = false; 
        errors += "Please enter a valid Buyer ID\n"; 
        } 
       break; 
      case "poc_n": 
       if(value == value.match(/^[a-zA-Z\s]+$/)){ 
        break; 
       } 
       else { 
        isValid = false; 
        errors += "Please enter a valid Name\n"; 
       } 
       break; 
      case "poc_e": 
       if(value == value.match(/^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/)){ 
        break; 
       } 
       else { 
        isValid = false; 
        errors += "Please enter a valid Email\n"; 
       } 
       break; 
      case "poc_p": 
       if(value == value.match('^[0-9()+/-]{10,}$')){ 
        break; 
       } 
       else { 
        isValid = false; 
        errors += "Please enter a valid Phone Number\n";  
       } 
       break; 
     } 
    }) 
    if(isValid){ 
     $this.html('Edit'); 
     tds.prop('contenteditable', false); 
    }else{ 
     alert(errors); 
    } 
} 
}); 
+0

kein Glück mit dieser leider – Rataiczak24

+0

Fügen Sie diese zwei Zeile element7.setAttribute ("Klasse", "bearbeiten"); element8.setAttribute ("Klasse", "deaktivieren"); bcoz in yr-Code fügen Sie keine Klasse zu neuer Schaltfläche hinzu. Ich teste es für mich. – Veer

0

Der Hauptgrund, warum die neu hinzugefügten Zeilen nicht reagieren t o Die Methoden edit und deactivate beruhen darauf, dass sie dynamisch erstellt wurden und somit nicht an die ursprünglich als onclick angegebenen Ereignisse gebunden waren. Möglicherweise müssen Sie diese Ereignisse nach dem Erstellen der Zeilen einfach anfügen. Der Codeausschnitt unten versucht zu veranschaulichen, wie.

Hinweis:
Das Snippet vereint unter Ihrem all Javascript-Code unter der Methode JQuery ready, da keine Notwendigkeit wäre, in einem Script separate ready Methoden zu haben. Zweitens, um die neue Zeile zu erstellen, wurde Jquery (anstatt Raw Javascript verwendet). Nur aus Gründen der Einfachheit.

HTML

<table id="html_master"> 
    <thead> 
    <tr> 
     <td>ID</td> 
     <td>Vendor</td> 
     <td>Buyer ID</td> 
     <td>POC Name</td> 
     <td>POC Email</td> 
     <td>POC Phone</td> 
     <td>Edit/Delete</td> 
    </tr> 
    </thead> 
    <tbody> 

    <?php 
     foreach ($dbh->query($sql) as $rows){ 
      ?> 
      <tr> 
       <td class="mr_id" contenteditable="false"><?php echo intval ($rows['MR_ID'])?></td> 
       <td class="mr_name" contenteditable="false"><?php echo $rows['MR_Name']?></td> 
       <td class="buyer_id" contenteditable="false"><?php echo $rows['Buyer_ID']?></td> 
       <td class="poc_n" contenteditable="false"><?php echo $rows['MR_POC_N']?></td> 
       <td class="poc_e" contenteditable="false"><?php echo $rows['MR_POC_E']?></td> 
       <td class="poc_p" contenteditable="false"><?php echo $rows['MR_POC_P']?></td> 
       <td><button class="edit" name="edit">Edit</button> 
        <button class="deactivate" name="deactivate">Deactivate</button></td> 
      </tr> 
      <?php 
     } 
    ?> 
    </tbody> 
</table> 

<div class="add-button-wrapper"> 
    <input type="button" class="add" value="Add Row" id="rowAdder"> 
</div> 

javascript: JQUERY

<script type="text/javascript"> 

    $(document).ready(function() { 
     var rowAdder = $("#rowAdder"); 
     var editButton = $(".edit"); 
     var deActivator = $('.deactivate'); 

     /* EVENT BINDINGS & HANDLING*/ 

     // BIND THE CLICK ACTION TO DEACTIVATION HANDLER 
     deActivator.click(deactivate); 

     // BIND THE CLICK EVENT TO THE EDITING HANDLER: 
     editButton.click(handleEdit); 

     // BIND THE CLICK ACTION TO THE NEW-ROW PROCESSING HANDLER: 
     rowAdder.click(addRow); 


     /* CALL-BACK FUNCTIONS:*/ 

     // HANDLE THE EDITING 
     function handleEdit(evt) { 
      var $this = $(this); 
      var tds = $this.closest('tr').find('td').not('.mr_id').filter(function() { 
       return $(this).find('.edit').length === 0; 
      }); 
      if ($this.html() === 'Edit') { 
       $this.html('Save'); 
       tds.prop('contenteditable', true); 
      } else { 
       var isValid = true; 
       var errors = ''; 
       $('#myDialogBox').empty(); 
       tds.each(function(){ 
        var type = $(this).attr('class'); 
        var value = $(this).text(); 
        switch(type){ 
         case "buyer_id": 
          if(!$.isNumeric(value)){ 
           isValid = false; 
           errors += "Please enter a valid Buyer ID\n"; 
          } 
          break; 
         case "poc_n": 
          if(value == value.match(/^[a-zA-Z\s]+$/)){ 
           break; 
          } 
          else { 
           isValid = false; 
           errors += "Please enter a valid Name\n"; 
          } 
          break; 
         case "poc_e": 
          if(value == value.match(/^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/)){ 
           break; 
          } 
          else { 
           isValid = false; 
           errors += "Please enter a valid Email\n"; 
          } 
          break; 
         case "poc_p": 
          if(value == value.match('^[0-9()+/-]{10,}$')){ 
           break; 
          } 
          else { 
           isValid = false; 
           errors += "Please enter a valid Phone Number\n"; 
          } 
          break; 
        } 
       }) 
       if(isValid){ 
        $this.html('Edit'); 
        tds.prop('contenteditable', false); 
       }else{ 
        alert(errors); 
       } 
      } 
     } 

     // HANDLE DEACTIVATION 
     function deactivate(evt) { 
      var $this = $(this); 
      var $tr  = $this.closest('tr'); 
      var action = $tr.hasClass('deactivated') ? 'activate' : 'deactivate'; 

      if (confirm('Are you sure you want to ' + action + ' this entry?')) { 
       $tr.toggleClass('deactivated'); 
       $this.text(function(i, t) { 
        return t == 'Deactivate' ? 'Activate' : 'Deactivate'; 
       }); 
      } 
     } 

     // ADD NEW ROW 
     function addRow(evt) { 
      var table  = $("#html_master"); 
      var rows  = table.children("tr"); 
      var rowCount = rows.length; 
      var row   = table.insertRow(rowCount); 


      // SIMPLY CREATE A NEW ROW OBJECT AND APPEND IT TO THE rows VARIABLE. 
      var newRow  = "<tr>"; 
      newRow   += "<td class='mr_id' contenteditable='false'>" + rowCount + "</td>"; 
      newRow   += "<td class='buyer_id' contenteditable='false'><input type='text' name='txtbox[]' />" + "</td>"; 
      newRow   += "<td class='poc_n' contenteditable='false'><input type='text' name='txtbox[]' />" + "</td>"; 
      newRow   += "<td class='poc_e' contenteditable='false'><input type='text' name='txtbox[]' />" + "</td>"; 
      newRow   += "<td class='poc_p' contenteditable='false'><input type='text' name='txtbox[]' />" + "</td>"; 
      newRow   += "<td class='mr_id' contenteditable='false'><input type='text' name='txtbox[]' />" + "</td>"; 
      newRow   += "<td class='mr_id' contenteditable='false'>"; 
      newRow   += "<button class='edit' name='edit'>Edit</button>"; 
      newRow   += "<button class='deactivate' name='deactivate'>Deactivate</button>"; 
      newRow   += "</td>"; 
      newRow   += "</tr>"; 

      // APPEND THE NEW ROW... 
      table.append(newRow); 

      // RE-BIND THE EVENTS ON THE BUTTONS SINCE THESE WERE DYNAMICALLY CREATED 

      // BIND THE CLICK ACTION TO DEACTIVATION HANDLER 
      table.find("deactivate").click(deactivate); 

      // BIND THE CLICK EVENT TO THE EDITING HANDLER: 
      table.find("edit").click(handleEdit); 
     } 

    }); 

</script> 
Verwandte Themen