如何读取window.open打开页面的XML内容并转为字符串
问题根因
两段代码无法获取目标XML内容,由两个核心问题导致:
- 时序错误:
window.open加载页面是异步流程,调用open后立即读取document时,目标资源尚未完成加载,只能拿到浏览器初始化新窗口时生成的默认空HTML结构,也就是你看到的空<html><head></head><body></body></html>内容。 - 同源策略限制:如果运行bookmarklet的当前页面与目标RSS地址不同源(协议、域名、端口任意一项不匹配),浏览器会直接拦截JS对新窗口document的读取操作,这是浏览器内置的安全机制,无法绕过直接读取跨源窗口的DOM内容。
你提到的修改doctype把XML转纯文本的思路无法解决上述两个核心问题,因此不会生效。
正确实现方案
放弃window.open读DOM的思路,直接用fetch请求目标XML资源,既不存在异步加载时序问题,也可以直接拿到完整的XML纯文本字符串,适配bookmarklet场景的实现代码如下:
javascript:(async function() { try { const resp = await fetch('https://supportcenter.checkpoint.com/supportcenter/secureKnowledgeRss'); // s即为存储完整XML内容的字符串变量 const s = await resp.text(); alert(`XML获取成功,总长度${s.length}字符,前500字符预览:\n${s.slice(0,500)}`); // 若需要全局使用s变量,可追加一行 window.s = s; } catch (e) { alert(`获取失败:${e.message}\n请先手动打开目标RSS地址确认可正常访问,在RSS页面下重新运行本书签即可规避跨域限制`); } })();
如果运行时出现跨域报错,只需要先手动打开一次目标RSS地址,在RSS页面的标签页下运行该书签即可,此时请求源与目标地址完全同源,不会触发跨域拦截。
为什么XMLSerializer方案失效
你之前调用XMLSerializer.serializeToString时拿到的是空文档,本质是读取s.document的时机太早,目标XML还未完成加载,叠加跨域拦截的影响,你操作的始终是新窗口初始化时生成的空HTML文档,和页面doctype类型没有关系。
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

