#javascript #php #jquery #html #validation
#javascript #php #jquery #HTML #проверка
Вопрос:
Итак, у меня есть таблица с двумя отдельными кнопками: Редактировать и деактивировать. Я смог использовать функцию привязки для деактивации и редактирования, чтобы заставить кнопку работать при добавлении строк. У меня также есть проверка для большинства полей. Проверка отлично работает с исходными строками, но не работает ни с какими строками, добавленными пользователем. Как я могу это исправить?
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><input type="button" class="edit" name="edit" value="Edit">
<input type="button" class="deactivate" name="deactivate" value="Deactivate"></td>
</tr>
<?php
}
?>
</tbody>
<br>
<input type="button" class="add" value="Add Row" onclick="addRow('html_master')">
</table>
<input type="button" class="add" value="Add Row" onclick="addRow('html_master')">
</body>
</html>
JavaScript:
// ----- Deactivate Row -----
function bindDeactivate() {
$('#html_master').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.val(function(i, t) {
return t == 'Deactivate' ? 'Activate' : 'Deactivate';
});
}
});
}
$(document).ready(function() {
// Bind the deactivate button click to the function
bindDeactivate();
});
$(document).ready(function() {
// Bind the edit button click to the function
bindEdit();
});
// ----- 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";
var setClass = document.createAttribute("class");
setClass.value = "edit";
element7.setAttributeNode(setClass);
var setClass1 = document.createAttribute("class");
setClass1.value = "deactivate";
element8.setAttributeNode(setClass1);
element7.attr="class";
element8.attr="class";
element7.value="Edit";
element8.value="Deactivate";
cell7.appendChild(element7);
cell7.appendChild(element8);
// Bind this new deactivate button click to the function
$('#html_master').off("click",'.deactivate');
bindDeactivate();
// Bind this new deactivate button click to the function
$('#html_master').off("click",'.edit');
bindEdit();
}
function bindEdit() {
$('#html_master').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.val() === 'Edit') {
$this.val('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 IDn";
}
break;
case "poc_n":
if(value == value.match(/^[a-zA-Zs] $/)){
break;
}
else {
isValid = false;
errors = "Please enter a valid Namen";
}
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 Emailn";
}
break;
case "poc_p":
if(value == value.match('^[0-9 () /-]{10,}$')){
break;
}
else {
isValid = false;
errors = "Please enter a valid Phone Numbern";
}
break;
}
})
if(isValid){
$this.val('Edit'); // Modifed
tds.prop('contenteditable', false);
}else{
alert(errors);
}
}
});
}
Комментарии:
1. Две вещи, не смешивайте и не сопоставляйте DOM старой школы и jQuery, это только добавит путаницы для вас и других разработчиков. Во-вторых. Похоже, вы отменяете привязку делегированного события при добавлении строки. ‘ $(‘#html_master’).off(«click»,’.deactivate’);’ В этом нет необходимости, поскольку вы уже используете делегированное событие
2. значит, мне не нужны эти строки кода?
3. Вы пытаетесь делегировать событие #html_master. при щелчке в любом месте таблицы. ваш щелчок срабатывает с условием, если щелкаемый элемент имеет class .deactivate . Вот как работают делегированные события. В предыдущей версии jQuery это было сделано с помощью . delegate() и .live() .
4. Попался! Итак, как я мог бы расширить проверку на добавленные строки?
5. Привязка исходного делегата, который у вас уже есть, делает это. Вы действительно должны использовать один из инструментов разработчика браузера и отлаживать это.