CodeFights排行榜无可见AJAX请求的实现方式技术问询
这确实挺有意思的!我来给你拆解几种可能的实现方式,CodeFights大概率是用了其中一种来“隐藏”数据传输的:
预加载全量数据:很多平台会在页面首次加载时,就把所有排行榜数据一次性塞进页面里——可能藏在某个隐藏的DOM元素中,或者直接作为全局JS变量存在内存里。切换页码的时候根本不需要发新请求,只是把预加载好的数据重新渲染出来而已。你可以试试在控制台里搜类似
leaderboardData、rankList这类关键词,说不定能找到预存的数据集。用WebSockets替代AJAX:如果他们用了WebSocket双向连接,数据是通过实时通道传输的,这类请求不会出现在普通的XHR列表里。你可以去Firebug的“网络”面板找“WS”标签,看看有没有持续的WebSocket连接,切换页码时有没有数据帧传输。
伪装成其他类型请求:有些网站会把数据塞进看似普通的资源请求里——比如动态生成的CSS文件、图片请求的query参数,甚至用
fetch请求但刻意隐藏了XHR标识。你可以检查页面切换时有没有新的奇怪资源加载,或者在控制台监听fetch事件来抓包:const originalFetch = window.fetch; window.fetch = function(...args) { console.log('Fetch调用:', args); return originalFetch.apply(this, args); };SSR页面切换伪装成单页应用:看起来是AJAX切换,但其实是后端直接渲染好不同页码的页面,切换时本质是页面跳转,只是用了前端过渡动画让体验像单页应用。你可以看看浏览器地址栏的URL有没有变化(比如哈希值
#page3),或者检查页面切换时有没有重新加载HTML文档。
你可以按上面的思路一步步排查,先找预加载的数据,再检查WebSocket和fetch请求,应该能找到他们的实现逻辑。
内容的提问来源于stack exchange,提问作者khoa_chung_89

