使用jQuery解析网站RSS数据时遇错误,请求协助排查
帮你排查jQuery获取RSS数据的几个常见问题
嘿,我看了你的代码,大概率是这几个地方出了问题,咱们一个个来捋:
1. 跨域请求被拦截(最常见的坑)
浏览器有个同源策略,不允许前端直接请求不同域名的资源,除非目标网站设置了CORS允许你的域名访问。你直接用$.ajax请求这个RSS地址,浏览器肯定会拦下来,这也是那个alert("An error occurred.")弹出来的主要原因。
怎么解决?
- 搞个后端代理:在你自己的服务器上写个小接口,让服务器先去请求这个RSS源,再把数据返回给前端。前端请求自己的服务器,就不会有跨域问题了。
- 要是不想搞后端,也可以看看这个RSS源支不支持JSONP格式,但这个源是XML的,大概率不支持,所以还是后端代理靠谱。
2. XML命名空间的处理不对
RSS里的content:encoded是带命名空间的标签,你用content\\:encoded在有些浏览器里可能识别不到。换个写法试试:用[nodeName="content:encoded"]来定位这个元素,兼容性更好。
3. 处理HTML内容时犯了小错
你拿到content:encoded的HTML后,直接用$html.find('ul')是不行的——因为.html()返回的是字符串,不是jQuery对象。得先把这个字符串转换成jQuery对象,再去查找里面的元素。
修正后的代码参考
// 注意:没解决跨域的话,这个代码还是会报错哦 $.ajax({ type: "GET", url: "https://tuhoc247.com/feed/", dataType: "xml", success: function (xml) { $(xml).find('item').each(function () { // 输出标题和链接 console.log("title : " + $(this).find("title").text()); console.log("link : " + $(this).find("link").text()); // 正确处理带命名空间的content:encoded var encodedHtml = $(this).find('[nodeName="content:encoded"]').html(); // 把字符串转成jQuery对象再查找元素 var $content = $(encodedHtml); console.log($content.find('ul').text()); }); }, error: function (xhr, status, error) { // 别只弹alert,把错误信息打出来才好排查 console.error("请求出错啦:", status, error); alert("An error occurred."); } });
小建议
打开浏览器的开发者工具(按F12),切换到「Network」标签,看看这个请求的状态码和错误详情,能更快定位问题——比如跨域的话会显示CORS相关的错误提示。
内容的提问来源于stack exchange,提问作者Huynh Nhọn
相关产品推荐
相关产品推荐

