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

Laravel9中如何用Ajax无刷新在表格显示新增待办任务

修复步骤

1. 修正HTML结构错误

你用<div id="items">包裹<tr>标签违反了HTML规范,<tr>必须放在<tbody>、<thead>或<table>内部。浏览器会自动修正这个错误,导致#items选择器无法正确关联表格行,这是load方法无效的核心原因。

修改视图结构,将id="items"移到<tbody>上:

<table>
    <tbody id="items">
        @php($menuCounter = 1)
        @forelse($tasks as $task)
            <tr>
                <td>{{ ++$menuCounter }}</td>
                <td class="ourItem" data-toggle="modal" data-target="#exampleModalCenter">{{ $task->task_name }}</td>
            </tr>
        @empty
            <tr>
                <td colspan="5" class="text-center">Nothing here to show</td>
            </tr>
        @endforelse
    </tbody>
</table>

2. 修复后端控制器的Request类问题

你的create方法参数使用小写request $request会导致类找不到错误,必须使用大写Request并引入命名空间:

use Illuminate\Http\Request;

class TaskListController extends Controller
{
    public function index()
    {
        $tasks = Tasklist::all();
        return view('admin.tasks.list',compact('tasks'));
    }
    
    public function create(Request $request)
    {
        // 可选:添加表单验证,防止空提交
        $request->validate([
            'text' => 'required|string|max:255'
        ]);
        
        $item = new Tasklist();
        $item->task_name = $request->text;
        $item->save();
        
        // 方案一:继续用load方法时返回字符串
        return 'Done';
        
        // 方案二:更高效的方式,返回新任务的HTML片段(推荐)
        // return view('admin.tasks._task_item', compact('item'));
    }
}

3. 优化Ajax回调逻辑

方案一:修复现有load方法

如果继续用load刷新列表,确保回调逻辑正确,并添加输入框清空、错误处理:

$('#AddButton').click(function(event){
    event.preventDefault(); // 阻止按钮默认行为(若按钮在表单内)
    var text = $('#addItem').val().trim();
    
    if (!text) {
        alert('请输入任务内容');
        return;
    }
    
    $.post('tasks-list-add', {'text': text, '_token': $('input[name=_token]').val()}, function(data){
        // 重新加载tbody内的所有元素,避免嵌套选择问题
        $('#items').load(location.href + ' #items > *');
        $('#addItem').val(''); // 清空输入框
    }).fail(function(xhr){
        console.error('请求失败:', xhr.responseText);
        alert('添加任务失败,请重试');
    });
});

方案二:返回HTML片段直接追加(推荐)

这种方式无需请求整个页面,性能更优:

  1. 创建部分视图resources/views/admin/tasks/_task_item.blade.php,内容为单个任务行:
<tr>
    <td>{{ $tasksCount + 1 }}</td>
    <td class="ourItem" data-toggle="modal" data-target="#exampleModalCenter">{{ $item->task_name }}</td>
</tr>
  1. 修改控制器create方法返回该视图:
public function create(Request $request)
{
    $request->validate([
        'text' => 'required|string|max:255'
    ]);
    
    $item = new Tasklist();
    $item->task_name = $request->text;
    $item->save();
    
    // 获取当前任务总数,用于计算行号
    $tasksCount = Tasklist::count();
    return view('admin.tasks._task_item', compact('item', 'tasksCount'));
}
  1. 修改Ajax回调:
$('#AddButton').click(function(event){
    event.preventDefault();
    var text = $('#addItem').val().trim();
    
    if (!text) {
        alert('请输入任务内容');
        return;
    }
    
    $.post('tasks-list-add', {'text': text, '_token': $('input[name=_token]').val()}, function(data){
        // 移除空状态提示(若存在)
        $('#items').find('tr:contains("Nothing here to show")').remove();
        // 追加新任务行
        $('#items').append(data);
        $('#addItem').val(''); // 清空输入框
    }).fail(function(xhr){
        console.error('请求失败:', xhr.responseText);
        alert('添加任务失败,请重试');
    });
});

4. 验证路由配置

确保路由为POST方法,指向正确的控制器方法:

use App\Http\Controllers\TaskListController;

Route::post('/tasks-list-add', [TaskListController::class, 'create'])->name('tasks.add');

内容的提问来源于stack exchange,提问作者Pouya Vaghefi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:44:57