PHP 看不到使用 jQuery 和 AJAX 创建的新元素



我遇到了一个问题,因为我无法用PHP脚本获得刚刚创建的元素。

我有一个用PHP加载的标签列表:

<ul>
<li>
<input class="adm-checkbox" type="checkbox" name="check_list_tags[]" value="4">
Some tag
<li>
<ul>

多亏了AJAX,我在UL 中添加了另一个元素

jQuery(document).ready(function($) {
$('.add-tag-btn').click(function(event) {
var tag_title = $('.tag-search').val();
$.ajax({
url: 'add-tag.php',
type: 'POST',
dataType: 'json',
data: {
'tag_title': tag_title
},
success:function(result){
$('.tag-search').val('');
$('.new-tags').append('<li><input class="adm-checkbox" type="checkbox" name="check_list_tags[]" value="'+result.tag_id+'">'+tag_title+'</li>');
console.log(result.tag_id);
}
});
});
});

因此,我有了一个新的UL

<ul>
<li><input class="adm-checkbox" type="checkbox" name="check_list_tags[]" value="4">Value #4</li>
<li><input class="adm-checkbox" type="checkbox" name="check_list_tags[]" value="5">Value #5 (new value generated with jQuery and AJAX)</li>
</ul>

但一旦我提交了表单,只有已存在的值被添加到DB中。

if (isset($_POST['submit'])) {
....
bla bla bla
foreach ($_POST['check_list_tags'] as $value) {
$arr2[] = $value;
}
bla bla bal
}

如果不重新加载页面,PHP似乎无法处理新值。同时,我添加

checked="checked"

动态的,这是完美的。

有人能告诉我如何强制PHP查看新创建的元素(通过jQuery附加到现有HTML中的元素(吗。

感谢大家的帮助。

upd:

这就是我添加"已检查"的方式

jQuery(document).ready(function($) {
$('.adm-checkbox').click(function(event) {
if (this.checked) {
this.setAttribute("checked", "checked");
console.log('checked');
} else {
this.removeAttribute("checked");
}
});
});

这就是表单的样子:

<form class="" action="<?php echo $router->url ?>" method="post" enctype="multipart/form-data">
.....
<ul class="new-tags">
</ul>
<ul>
<?php foreach ($admin->getAdmTags() as $value): ?>
<li><input class="adm-checkbox" type="checkbox" name="check_list_tags[]" value="<?php echo $value['id'] ?>"><?php echo $value['title'] ?></li>
<?php endforeach; ?>
<ul>
</form>

UPD#2:

原因可能是我在jQuery中使用了两个单独的函数来表示"已检查"??!?!

$('.adm-checkbox').click(function(event) {
if (this.checked) {
this.setAttribute("checked", "checked");
console.log('checked');
} else {
this.removeAttribute("checked");
}
});

$('.adm-tags').on('click', '.adm-checkbox', function(event) {
if (this.checked) {
this.setAttribute("checked", "checked");
console.log('checked');
} else {
this.removeAttribute("checked");
}
});

我这么做是因为onclick不适用于新创建的元素。

附言:我把一个新创建的"li"放在哪里并不重要。。。

感谢大家的参与。我创建了一个新页面,并重新完成了所有操作。现在它起作用了。现在我需要在我的完整代码中找到错误

Name属性可以是数组,所以名称不是问题所在-HTML输入数组

我认为原因是,正如您所提到的,checked属性需要添加到所有输入中,否则该值将不会在请求中发送。

例如,如果输入是文本或数字,则不需要checked属性。

这同样适用于无线电输入或选择菜单的selected属性。

TLDR,添加checked:

$('.new-tags').append('<li><input class="adm-checkbox" type="checkbox" name="check_list_tags[]" value="'+result.tag_id+'" checked>'+tag_title+'</li>');

当然,如果它应该自动检查,而不是依赖于用户手动检查。

我可能不得不根据这是传统的表单提交还是不使用表单的ajax提交来更改这个答案

我不知道如何结束这个话题。它与新创建的代码配合使用。一旦我在完整的代码中发现错误,我会回复并解释我的错误。

当您通过POST或GET发送表单时,每个输入都需要一个唯一的名称。从您的代码中,看起来您添加了一个新的输入元素,该元素具有与现有元素相同的值的name属性。

我怀疑,如果添加具有唯一名称值的新元素,它应该可以工作。您可以将其合并到JavaScript代码中,方法是为名称为X的输入元素的数量设置一个计数器,然后添加一个数字。您还需要在PHP中做类似的事情。

编辑:显然,如果你在名称后面使用"[]",你可以拥有相同名称的名称属性,谢谢@martincallin87

最新更新