Chrome扩展内容脚本中无法通过name获取表单的原因
为什么Chrome扩展内容脚本里
document.myForm返回undefined,但控制台可以正常获取? 核心原因是Chrome扩展的内容脚本运行在**隔离世界(Isolated World)**里,和页面主上下文(包括控制台默认的执行环境)完全隔离:
- 页面主上下文里,浏览器会自动把带
name属性的表单、iframe等元素挂载为document的属性(比如document.myForm),这是浏览器给页面环境提供的便捷特性,但这个特性只在页面自身的JS上下文生效。 - 内容脚本的执行环境是独立的,它不会继承页面上下文里的这个自动挂载行为,所以
document.myForm会返回undefined。 - 而
document.querySelector("form[name=myForm]")是标准DOM查询API,内容脚本和页面上下文共享同一棵DOM树,所以不管在哪个环境都能正常查到元素。
至于控制台能正常获取,是因为默认情况下控制台运行在页面的主上下文里,自然能访问到浏览器自动挂载的document属性。如果想验证内容脚本的环境,你可以打开Chrome扩展开发者工具的「内容脚本」标签页,在那里执行document.myForm,结果同样会是undefined。
建议你继续使用标准DOM API(比如querySelector、getElementsByName)来获取元素,不要依赖document.xxx这种非标准的便捷挂载,这样代码更可靠,也不会受执行上下文的影响。
内容的提问来源于stack exchange,提问作者Slev7n
相关产品推荐
相关产品推荐

