使用JavaScript更改document.readyState是否可行?

3

我正在通过iframe在网站上加载HTML。被加载的HTML应该在父文档完成加载后才等待加载某些内容(document.readyState == 'interactive' || document.readyState == 'complete')。问题是,HTML内容是手动加载到iframe中的,而这个操作是在父文档完成加载之后进行的。

有没有办法欺骗父文档的readyState以验证加载的HTML内容没有过早地呈现?


我非常确定 jQuery 1.9 及之前版本中包含了一些针对这种情况的“变通方法”。您可能希望查看相关源代码,了解其中的技巧。 - user2864740
你是在指 $.isReady 吗?我认为它是与 $(document).ready() 协同工作的,实际上并没有修改 document.readyState。我需要查看 jQuery 源文件,看看到底发生了什么。拥有一个纯 JavaScript 的解决方案会很好。 - amdilley
为什么不使用$.Deferred()呢?这样你就可以返回一个promise,然后只有在deferred被解决时才加载iframe。如果需要进一步解释,请告诉我... - Alex Shilman
如果您能更详细地描述您试图解决的实际问题,我们可能会更好地帮助您。 - jfriend00
我处理以脚本标签形式提供的广告放置,这些标签将在页面内的iframe中执行。测试广告时,广告的初始加载必须在一定范围内。其余部分可以在父文档完成加载后加载。为了让广告按需加载,我设置了一个文本区域字段,可以将相关的脚本标签粘贴到其中。通过单击相邻的按钮,textarea内容将作为iframe的HTML加载。为了验证大部分负载是在页面加载后进行的,我需要一种模拟加载环境的方法。 - amdilley
2个回答

4
这是对你问题的部分回答: 这里有两件不同的事情:文档对象模型JavascriptDOM是存储显示此页面的查看器所需信息的浏览器状态。 Javascript是用于查询/操作状态(读取DOM)的工具。 DOM会通知Javascript状态更改,这只是单向的,因为该属性是只读的。简短回答你的问题是“不”,你不能使用Javascript更改readyState属性。
为了自己验证这一点,可以打开控制台(Firebug、Chrome dev tools等),在控制台中输入:
typeof document.readyState // "String"
document.readyState // "complete"
document.readyState = "hello world" // "hello world"
document.readyState // if you expected it to show "hello world" it still shows "complete"

2

let readyState = 'loading';
Object.defineProperty(document, 'readyState', {
    get() { return readyState },
    set(value) { return readyState = value },
});

console.log(document.readyState);
document.readyState = 'interactive';
console.log(document.readyState);
document.readyState = 'complete';
console.log(document.readyState);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接