JavaScript弹出undefined,控制器与模型无法获取item_id求助
问题排查与修复方案
看起来你遇到了几个连锁问题:item_id 弹出 undefined、alert 不触发,同时后端也拿不到数据。咱们一步步拆解解决:
1. 先解决函数执行中断的核心问题
你的 calc(i) 函数里直接用了 event.keyCode,但没有把 event 作为参数传递到函数里,这会在部分浏览器里抛出「event 未定义」的错误,导致函数执行到这一行就中断了——后面的 alert(item_id) 和 Ajax 请求根本没机会运行。
修复步骤:
- 修改视图里的
onKeyup绑定,把event传进去:<input type='text' name='quantity[]' id='quantity_1' class="form-control addrow quantity" style='width:100%' onKeyup='calc(1, event);'/> - 同步修改 JS 函数的定义:
这样就能保证函数完整执行,alert 也能正常弹出,方便你调试。function calc(i, event) { if(event.keyCode == 13) { add_row(); } else { var item_id=$("#item_"+i).val(); alert(item_id); // 后续代码保持不变 } }
2. 修复 Select 选项渲染的问题
你的视图代码里有两个明显的错误,导致 Select 没有可选项,val() 自然返回 undefined:
- 没有初始化
$opn1变量,也没有把拼接好的选项输出到页面; - 多余的
print_r($prolist)会把数组直接打印在页面上,破坏 HTML 结构,导致 Select 元素无法正常被 jQuery 选中。
修复后的视图代码:
<td style='width:20%' id='producttd_1'> <select name='item[]' id='item_1' class="form-control selectpicker" style='width:100%' data-show-subtext="true" data-live-search="true" > <?php $opn1 = ""; // 先初始化变量 if(!empty($prolist)) { foreach($prolist as $pro) { $opn1.="<option value='".$pro['id']."'>".$pro['product_name']."</option>"; } echo $opn1; // 把拼接好的选项输出到页面 } ?> </select> </td>
3. 验证动态行的 ID 匹配
如果你用 add_row() 动态添加新行,一定要保证新行的 Select 元素 ID 是 item_2、item_3... 对应的 quantity 输入框的 onKeyup 参数要传对应数字(比如 calc(2, event)),这样 $("#item_"+i) 才能精准找到对应的元素。
4. 后端调试与容错
如果前端能正确传递参数了,后端还是拿不到数据,可以先在控制器里打印所有 POST 参数排查:
function product_det() { // 先打印所有POST数据,确认参数是否传递成功 print_r($this->input->post()); $item=$this->input->post('item_id'); $quantity=$this->input->post('quantity'); $rate=$this->input->post('rate'); // 后续业务逻辑保持不变 }
另外给模型加个容错处理,避免空参数导致查询错误:
function get_productDet($item) { if(empty($item)) { return []; } $this->db->select('*'); $this->db->from('product'); $this->db->where('id',$item); return $this->db->get()->row_array() ?? []; }
按这个顺序修复后,应该能解决你遇到的大部分问题,如果还有疑问,可以打开浏览器开发者工具(F12)的 Network 标签,查看 Ajax 请求的参数是否正确传递,进一步定位问题。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

