【问题标题】:I get "(variablename) is null" when trying to edit dom elements inside an iframe尝试在 iframe 中编辑 dom 元素时出现“(变量名)为空”
【发布时间】:2019-07-19 17:05:05
【问题描述】:

我不知道 jQuery,我正在尝试仅使用 ECMAScript (ES6),我在 W3Schools 上找到了一种在 <iframe> 中编辑 DOM 元素的方法

我的代码一模一样:

let iframe = document.getElementById("music");
let elmnt = iframe.contentWindow.document.getElementById("player");
elmnt.play();

我有一个 id="music" 的 iframe 标签和一个 id="player" 的音频标签。代码应该在页面加载时播放音频源,它可以工作,但我仍然在控制台中收到错误,并且我无法与 ES6 的音量交互。

但我得到:“TypeError: elmnt is null (sketch: line 29)”

这是一个例子:https://codepen.io/mark_karrica_/pen/zgxyVL

(我正在使用 p5.js 库,但我认为问题与此无关)

【问题讨论】:

  • 听起来你没有找到元素......
  • 在尝试访问其中的元素之前确保 iframe 已加载
  • @charlietfl 如何确定 iframe 已加载?有回调什么的吗?
  • @Amy imgur.com/Sac7rAs 您可以在控制台顶部看到该错误

标签: javascript html dom ecmascript-6 p5.js


【解决方案1】:

您的代码在 iframe 完成加载之前正在运行。您可以通过将代码设置为在框架加载后运行来防止这种情况发生。 iframe 元素有一个 load 事件,您可以将事件处理程序附加到。

<iframe id="myframe" src="..." onload="iframeLoaded()"></iframe>

在这里,我已将事件处理程序iframeLoaded 附加到框架的load 事件。然后将代码粘贴到该方法中:

function iframeLoaded() {
    let iframe = document.getElementById("music");
    let elmnt = iframe.contentWindow.document.getElementById("player");
    elmnt.play();
}

【讨论】:

  • 谢谢!我用谷歌搜索并使用了这个:if (iframe.readyState == 'complete'){} 我认为您发布的内容与我使用的内容没有区别
  • 事件处理程序中的那一行不是必需的,因为只有 iframe 准备好后才会发出 load 事件。欢迎您将自己的解决方案作为单独的答案发布。
  • "SecurityError: Permission denied to access property "document" on cross-origin object (sketch: line 6)" 但至少它会尝试执行代码
  • 我建议提出一个新问题。浏览器围绕 iframe 提供了很多安全性,您可以阅读有关 on MDN 的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多