You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在CodeIgniter中使用onclick事件存储额外字段数据的问题

解决CodeIgniter中点击单选框动态添加表单字段的问题

我明白你遇到的问题了——在普通PHP里能正常工作的动态字段添加,到了CodeIgniter里用form_input()就失效了。这其实是服务器端代码和客户端代码执行顺序的问题,咱们一步步来解决:

为什么用form_input()的写法不行?

PHP是服务器端语言,页面加载时所有PHP代码都会先执行完毕,然后把生成的HTML发送给浏览器。你把<?php echo form_input(['name'=>'bankdetail']);?>写在JS字符串里,服务器只会把这段PHP代码当成普通文本输出到JS里,浏览器执行JS时只会看到这段字符串,不会再去解析执行PHP,所以自然不会生成正确的输入框。

下面给你几个可行的解决方案:


方案1:提前生成字段并隐藏,点击时显示

这个方法最稳妥,让CI提前生成好输入框,默认隐藏,点击单选框时再显示出来:

<!-- 单选框部分 -->
<div class="radio">
    <?php echo form_radio('bank', 'Online Payment', FALSE, ['onclick'=>"toggleBankFields(true)"]); ?>
    <?php echo form_label('Online Payment', 'bank');?><br>
    <?php echo form_radio('bank', 'Cash', FALSE, ['onclick'=>"toggleBankFields(false)"]); ?>
    <?php echo form_label('Cash', 'bank');?>
</div>

<!-- 提前用CI生成银行详情字段,默认隐藏 -->
<div id="bankFields" style="display:none;">
    Enter Bank Details<br>
    <?php echo form_input(['name'=>'bankdetail']);?>
</div>

<script>
function toggleBankFields(show) {
    const fields = document.getElementById("bankFields");
    fields.style.display = show ? "block" : "none";
}
</script>

方案2:在JS中直接写原生HTML输入框

如果不想提前生成字段,也可以直接在JS里写原生HTML,只要保证name属性和CI后端接收的一致就行:

<div class="radio">
    <?php echo form_radio('bank', 'Online Payment', FALSE, ['onclick'=>"add_fields()"]); ?>
    <?php echo form_label('Online Payment', 'bank');?><br>
    <?php echo form_radio('bank', 'Cash', FALSE, ['onclick'=>"clear_fields()"]); ?>
    <?php echo form_label('Cash', 'bank');?>
</div>

<p id="content"></p>

<script>
function add_fields() {
    const d = document.getElementById("content");
    d.innerHTML = "Enter Bank Details<br /> <input type='text' name='bankdetail' />";
}

function clear_fields() {
    const d = document.getElementById("content");
    d.innerHTML = "";
}
</script>

后端接收数据的时候,和普通字段一样用CI的输入类获取:

$bankDetail = $this->input->post('bankdetail');

方案3:将CI生成的字段HTML存入JS变量

如果一定要用form_input()生成字段,可以在页面加载时把生成的HTML存在一个JS变量里,之后JS直接用这个变量:

<script>
// 页面加载时,让CI生成输入框的HTML并赋值给JS变量
const bankInputHtml = "<?php echo addslashes(form_input(['name'=>'bankdetail'])); ?>";

function add_fields() {
    const d = document.getElementById("content");
    d.innerHTML = "Enter Bank Details<br /> " + bankInputHtml;
}

function clear_fields() {
    const d = document.getElementById("content");
    d.innerHTML = "";
}
</script>

这里用addslashes()是为了转义HTML里的引号,避免JS语法错误。


不管用哪个方案,记得测试后端是否能正常接收到bankdetail字段的数据,确保表单的method是POST,并且CI的CSRF保护(如果开启的话)也能正常工作(动态添加的字段不需要额外处理CSRF,只要表单里有CSRF令牌就行)。

内容的提问来源于stack exchange,提问作者Sagar Parikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:16:59