我建立了一个带有复选框和几个文本字段的表单,并且对其进行了设置,以便用户可以添加这组元素的其他出现。我通过创建一个包含这些元素的div(显示设置为“无”)来完成此操作。然后,JavaScript会克隆并根据需要显示此div(如果没有$ _POST数据,则一次;对于用户单击一次;如果有$ _POST数据,则x次)。 Javascript还对元素进行了唯一且顺序的标记-我将其设置为读入序列化数组以最终插入MySQL-“ occurrence [integer] [name]”。
到目前为止,一切都很好。一切都按预期进行,$ _ POST输出正是我对MySQL的需求。
我的麻烦是试图在表单元素中显示$ _POST数据。在下面的代码中,我有一个设置为PHP $ _POST数据的JS变量-只要使用不带任何变量的静态代码,它实际上就可以工作。换一种说法,
newField[i].value ='<?php echo $_POST[occurrence][1][start_date]; ?>';
确实显示了该值(尽管在每个字段中)。
显然
newField[i].value ='['+counter+']['+theName+']';
正确显示该字段的计数器和名称。但是当我尝试像这样合并时,什么也没得到
newField[i].value ='<?php echo $_POST[occurrence]['+counter+']['+theName+']; ?>';
这是我的完整代码:
<?php
$occ_count = count($_POST['occurrence']);
?>
<script type="text/javascript">
var counter = 0;
function moreFields() { // this function clones the div containing the elements and allows it to display
counter++;
var newFields = document.getElementById('readroot').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
var newField = newFields.childNodes;
for (var i=0;i<newField.length;i++) {
var theName = newField[i].name
if (theName) {
newField[i].name = 'occurrence['+counter+']['+theName+']';
}
newField[i].value ='<?php echo $_POST[occurrence]['+counter+']['+theName+']; ?>';
}
var insertHere = document.getElementById('writeroot');
insertHere.parentNode.insertBefore(newFields,insertHere);
}
function addLoadEvent(func) { // this function allows multiple functions to be called on page load
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
// this bit determines how many times the moreFields function should be called, based on $_POST data
var occ_count = "<?php echo $occ_count; ?>";
if(occ_count == 0) {window.onload = moreFields;}
else if(occ_count >= 1) {
for (var n=0;n<occ_count;n++) {
addLoadEvent(moreFields);
}
}
</script>
</head>
<body>
<h2>JS test2</h2>
<div id="readroot" style="display: none">
<label for="all_day">All Day</label>
<input type="checkbox" name="all_day"
onClick="allday(this, this.form)"/>
<label for="start_date">From:</label>
<input type="text" name="start_date"
value="" size="15" />
<label for="start_time"></label>
<input type="text" name="start_time"
value="" size="15" />
<label for="end_date">To:</label>
<input type="text" name="end_date"
value="" size="15" />
<label for="end_time"></label>
<input type="text" name="end_time"
value="" size="15" />
<a href="javascript:;" onclick="this.parentNode.parentNode.removeChild(this.parentNode);">Delete</a>
<br /><br />
<hr style="border: 0;color: #ddd;background-color: #ddd;height: 1px;">
</div> <!--readroot-->
<form method="post" >
<span id="writeroot"></span>
<p id="addnew"><a href="javascript:moreFields()">Add New</a></p>
<input type="submit" value="Send form" />
</form>
<hr>
<?php if($_POST) : ?>
<?php // this is purely for troubleshooting
echo 'count: '.count($_POST['occurrence']).'<br />';
foreach ( $_POST as $varname => $postitem ) {
echo 'name: '.$varname.' value: ';
print_r($postitem);
echo '<br />';
}
?>
<?php endif; ?>
</body>
我不知道这仅仅是语法问题还是结构上不可能的事情。我知道JS应该在PHP之后加载,但是我可以获取JS变量来生成php $ _POST数据,所以发生了一些事情。显然,我很困惑。但是我也对其他任何(甚至完全不同)的想法持开放态度,以实现自己的需求。
感谢您的任何想法,想法或建议!
最佳答案
如@Mark所言,您正在尝试将服务器端PHP与客户端Javascript连接起来-这根本行不通。在将<?php
和?>
标记中的所有内容都将在将页面发送到客户端之前进行评估-因此实际的PHP代码将是这样:
echo $_POST['occurrence']['+counter+']['+theName+'];
我猜想这实际上是在您的PHP数组中查找名为
'+counter+'
和``'+ theName +'''的键,当然这些都不存在。有两种方法可以正确执行此操作-我猜最简单的方法是将PHP转储到javascript变量中:
var postOccurrence = <?php echo json_encode($_POST['occurrence']); ?>;
然后,将Javascript循环中的代码更新为:
newField[i].value = postOccurrence[counter][theName];
另一个简单的选择是用PHP而不是Javascript进行循环,并使其输出0到n字段的静态Javascript代码。
关于php - JS表单元素出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5491357/