JQuery报错:Uncaught TypeError

在学习JQuery时遇到Jsonp调用百度搜索接口的问题,错误为Uncaught TypeError。通过分析发现GET请求需要包含cb参数,添加后仍然报错。解决方法是添加jsonpCallback和对应动态或固定的函数名,从而成功调用接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天在入门JQuery,学到Jsonp的知识点,想简单调用一下百度搜索的关键字联想接口,但一直报错:
Uncaught TypeError: Cannot read property 'sug' of undefined at...
代码如下:

<script type="text/javascript", src="js/jquery-1.12.4.min.js"></script>
<script type="text/javascript">

$.ajax({
    url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?",
    type:"get",
    dataType:"jsonp",
    data:{wd:"a"}
})

.done(function(data){
    console.log(data);
})
</script>

这里写图片描述
这里写图片描述

我按照网上方法,但似乎都没能解决,用浏览器直接访问接口出现了这样的画面
这里写图片描述

所以应该是GET参数有误的问题。结果筛选发现除了wd外,cb是必要的
这里写图片描述
于是在data那里增加了cb参数
这里写图片描述

不过依旧报错
这里写图片描述
这里写图片描述

这里是因为没有约定回调函数的原因,加上jsonpCallback以及对应的函数名即可,代码如下:

<script type="text/javascript", src="js/jquery-1.12.4.min.js"></script>
<script type="text/javascript">

$.ajax({
    url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?",
    type:"get",
    dataType:"jsonp",
    data:{
        wd:"a",
        cb:"jQuery1102007692530514095441_1530145183899",
    },
    jsonpCallback:"jQuery1102007692530514095441_1530145183899"
})
.done(function(data){
    console.log(data);
})

</script>

这里写图片描述

强调一下:这里的函数名是动态生成的,但用上面固定的也能正常使用,而时间久了会不会失效暂时不知道,如果失效可以从chrome抓包获取新的值。或者查看网页源码,解析动态生成相应值的算法。

<think>根据报错信息,`obj.pushFile(...).getFiles is not a function`,说明在Layui 2.11版本中,`obj.pushFile()`返回的对象并没有`getFiles`方法。这可能是由于版本差异导致的API变化。我们需要调整获取文件列表的方式。 在Layui 2.11的文档中,`pushFile`方法返回的是当前的上传实例,而文件列表存储在实例的`files`属性中(该属性是一个数组)。因此,我们可以这样修改: 原代码: var files = obj.pushFile().getFiles(); 修改为: var files = obj.pushFile().files; 或者,我们也可以直接使用`obj.files`(但注意,在Layui 2.11中,`obj.files`可能是一个类数组对象,我们可以将其转换为数组): var files = Array.from(obj.files || []); 但根据Layui 2.11的文档,推荐使用`pushFile`方法获取实例,然后通过实例的`files`属性获取文件数组。 因此,我们调整代码: 完整修改后的代码: ```javascript upload.render({ elem: '#uploadBtn', url: '/upload', auto: false, bindAction: '#submitBtn', choose: function(obj) { // 修改点:使用 .files 而不是 .getFiles() var files = obj.pushFile().files; // 这里直接获取数组 // 创建文件列表HTML var html = ''; layui.each(files, function(index, file) { html += '<div class="layui-upload-file-item" data-index="' + index + '">' + '<i class="layui-icon layui-icon-file"></i>' + '<div class="file-info">' + '<div class="file-name">' + file.name + '</div>' + '<div class="file-size">' + formatFileSize(file.size) + '</div>' + '</div>' + '<i class="layui-icon layui-icon-close" onclick="deleteFile(this)"></i>' + '</div>'; }); $('#file-list').html(html); window.uploadFiles = files; // 存储为全局数组 } }); ``` 同时,我们之前定义的`deleteFile`函数和`formatFileSize`函数保持不变。 另外,注意在Layui 2.11中,`obj.pushFile()`返回的上传实例的`files`属性是一个数组,所以我们可以直接使用。 如果仍然遇到问题,我们可以尝试另一种方法:直接使用`obj.files`(这是一个FileList对象,需要转换为数组): var files = Array.from(obj.files || []); 但根据Layui的文档,使用`pushFile`方法返回的实例的`files`属性是推荐做法。 因此,我们采用第一种修改方式。 如果修改后仍然报错,请检查Layui版本是否确实是2.11,因为不同的小版本也可能有差异。 下面提供两种方式,任选其一: 方式一(推荐,使用实例的files属性): var files = obj.pushFile().files; 方式二(使用原生FileList转换): var files = Array.from(obj.files || []); 我们选择方式一,因为这样获取的是Layui已经处理过的数组(可能包含一些额外的信息,但根据文档,它包含的就是文件对象数组)。 注意:在Layui 2.11中,`obj.pushFile()`返回的上传实例的`files`属性确实是一个数组,所以我们可以直接使用。 修改后的完整代码示例(仅修改了获取文件数组的方式):</think>这个错误表明在 Layui 2.11 版本中,`obj.pushFile().getFiles()` 方法不存在。这是因为 Layui 在不同版本中 API 有所变化。以下是针对 Layui 2.11 的正确解决方案: ### 修复后的完整代码(Layui 2.11 兼容版) ```javascript upload.render({ elem: '#uploadBtn', url: '/upload', auto: false, bindAction: '#submitBtn', choose: function(obj) { // 正确获取文件列表的方式(Layui 2.11) // 直接使用 obj.files 并转换为数组 const files = Array.from(obj.files || []); // 或者使用原始文件输入框的文件列表 const rawFiles = Array.from(this.files || []); // 推荐使用第一种方式 const fileList = files; // 创建文件列表HTML let html = ''; layui.each(fileList, function(index, file) { html += `<div class="layui-upload-file-item" data-index="${index}"> <i class="layui-icon layui-icon-file"></i> <div class="file-info"> <div class="file-name">${file.name}</div> <div class="file-size">${formatFileSize(file.size)}</div> </div> <i class="layui-icon layui-icon-close" onclick="deleteFile(this)"></i> </div>`; }); // 更新文件列表显示 $('#file-list').html(html); // 存储文件列表到全局变量(重要!) window.uploadFiles = fileList; } }); // 文件大小格式化函数 function formatFileSize(bytes) { if (!bytes || bytes === 0) return '0 B'; const units = ['B', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(1024)); return (bytes / Math.pow(1024, i)).toFixed(2) + ' ' + units[i]; } // 文件删除函数 function deleteFile(element) { const $item = $(element).closest('.layui-upload-file-item'); const index = $item.data('index'); // 从全局文件列表中移除 if (window.uploadFiles && window.uploadFiles.length > index) { window.uploadFiles.splice(index, 1); } // 从DOM中移除 $item.remove(); // 更新所有文件的索引 $('.layui-upload-file-item').each(function(i) { $(this).data('index', i); }); } // 提交上传 $('#submitBtn').click(function() { if (!window.uploadFiles || window.uploadFiles.length === 0) { layer.msg('请先选择文件'); return; } // 创建FormData对象 const formData = new FormData(); $.each(window.uploadFiles, function(i, file) { formData.append('files[]', file); // 注意字段名 }); // 发送AJAX请求 $.ajax({ url: '/upload', type: 'POST', data: formData, contentType: false, processData: false, beforeSend: function() { layer.load(1); // 显示加载动画 }, success: function(res) { layer.closeAll('loading'); if (res.code === 0) { layer.msg('上传成功'); } else { layer.msg('上传失败: ' + res.msg); } }, error: function() { layer.closeAll('loading'); layer.msg('服务器错误'); } }); }); ``` ### 关键修改说明 1. **API 变更修复**: - 移除了 `obj.pushFile().getFiles()` 方法调用 - 使用 `Array.from(obj.files)` 直接转换文件列表 - 添加了空值保护 `obj.files || []` 2. **文件存储方式**: - 使用 `window.uploadFiles` 全局变量存储文件列表 - 在删除和提交时直接操作这个数组 3. **错误处理增强**: - 添加了加载状态提示 - 增加了服务器响应处理 - 加强了删除操作的安全检查 ### 完整HTML结构 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Layui 2.11 文件上传</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layui@2.11.0/dist/css/layui.css"> <style> .layui-upload-list { margin-top: 15px; border: 1px solid #e6e6e6; border-radius: 2px; padding: 10px; } .layui-upload-file-item { display: flex; align-items: center; padding: 8px 10px; border-bottom: 1px solid #eee; } .layui-upload-file-item:last-child { border-bottom: none; } .file-info { flex: 1; margin-left: 10px; overflow: hidden; } .file-name { font-weight: bold; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .file-size { color: #999; font-size: 12px; } .layui-upload-file-item .layui-icon-close { cursor: pointer; color: #ff5722; font-size: 18px; } </style> </head> <body> <div class="layui-container" style="margin-top: 20px;"> <!-- 上传按钮 --> <button type="button" id="uploadBtn" class="layui-btn"> <i class="layui-icon"></i>选择文件 </button> <!-- 提交按钮 --> <button type="button" id="submitBtn" class="layui-btn layui-btn-normal"> <i class="layui-icon"></i>开始上传 </button> <!-- 文件列表容器 --> <div id="file-list" class="layui-upload-list"></div> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/layui@2.11.0/dist/layui.js"></script> <script> // 上面的JavaScript代码放在这里 </script> </body> </html> ``` ### 调试建议 如果仍然遇到问题,可以在 `choose` 回调中添加调试信息: ```javascript choose: function(obj) { console.log('obj.files:', obj.files); console.log('obj.pushFile:', obj.pushFile); // 获取文件列表的备选方法 const files = this.files ? Array.from(this.files) : []; console.log('files:', files); // ...其余代码 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值