Laravel中Ajax调用无法请求服务器,求问题排查方案
解决jquery.atwho远程请求无响应的问题
看你提供的代码,我发现几个关键问题导致没有XHR请求发起,咱们一步步来排查修复:
1. 绑定元素错误(最核心问题)
你把atwho绑定到了$('#body'),但jquery.atwho需要绑定到可输入的元素(比如<textarea>、<input>或者设置了contenteditable="true"的元素),就像你本地示例里的#inputor一样。body不是可输入元素,插件根本不会触发输入监听逻辑,自然不会发起请求。
修复方法:把绑定目标改成你的实际输入框,比如如果你的输入框id确实是body,先确保它是可输入类型:
<!-- 确保是可输入元素,比如textarea --> <textarea id="body"></textarea>
2. CSRF令牌的语法错误
你的ajax请求里_token: {{csrf_token()}}会触发JS语法错误——blade输出的令牌如果没有引号包裹,特殊字符会破坏脚本结构。而且Laravel的GET请求默认不需要校验CSRF令牌,你可以直接去掉这个参数,或者正确包裹引号:
// 方案1:去掉_token参数(GET请求无需校验CSRF) data: { name: query }, // 方案2:正确添加引号包裹令牌 data: { name: query, _token: "{{csrf_token()}}" },
另外你添加的X-CSRF-TOKEN请求头对GET请求来说也是多余的,完全可以删掉这部分简化代码。
3. 路由与控制器的潜在问题
- 确认
Api\UserController的命名空间正确:比如控制器文件在app/Http/Controllers/Api/UserController.php,路由要对应正确的命名空间:// 推荐用路由分组统一管理API路由 Route::prefix('api')->namespace('Api')->group(function () { Route::get('/users', 'UserController@index'); }); // 或者直接写完整命名空间 Route::get('/api/users', 'App\Http\Controllers\Api\UserController@index'); - 控制器查询可以优化得更规范,同时避免潜在的语法问题:
public function index(Request $request) { $search = $request->input('name'); // 用大括号包裹变量更清晰,避免字符串拼接错误 return User::where('name', 'LIKE', "{$search}%")->take(5)->pluck('name'); }
4. 依赖加载顺序确认
确保脚本加载顺序严格遵循:
- jQuery
- jquery.caret.js
- jquery.atwho.js
- 你的初始化脚本
和你本地能正常运行的示例顺序保持一致,顺序错乱会导致atwho找不到依赖而静默失败。
修复后的完整脚本示例
<script> // 绑定到正确的可输入元素 $('#body').atwho({ at: "@", delay: 500, callbacks: { remoteFilter: function (query, callback) { $.getJSON('/api/users', { name: query }, function (usernames) { console.log('获取到用户数据:', usernames); callback(usernames); }).fail(function() { console.log('请求失败,请检查路由和控制器'); }); } } }); </script>
最后建议打开浏览器控制台(F12),先看Console标签有没有JS语法错误,再看Network标签有没有请求发起,这能帮你更快定位剩余问题。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

