【问题标题】:Cannot select the radio button using javascript when the page is in an iframe当页面位于 iframe 中时,无法使用 javascript 选择单选按钮
【发布时间】:2019-06-20 08:53:08
【问题描述】:

我在包含第二页的第一页上有一个 iframe。 iframe 没有 id,所以我必须使用 javascript 为其分配一个。分配 ID 后,我尝试使用 javascript 单击其中包含值“女性”的单选按钮。但是,当我这样做时,我在控制台中收到一条错误消息:“错误:执行脚本'分类面孔'失败!无法读取属性'click' of null”。我做错了什么?

var myframe = document.getElementsByTagName("iframe")[0];
myframe.id = "newID";
document.getElementById("newID").contentWindow.document.querySelector("input[value='female']").click();

首页:

<iframe src="http://chatwithibot.com/test2.php"></iframe>

第二页:

<form action="/testx.php" method = "POST">
<input type="radio" name="gender" value="male"> Male<br>
<input type="radio" name="gender" value="female"> Female<br>
<input type="radio" name="gender" value="other"> Other
<input type="submit" value="Submit">
</form> 

【问题讨论】:

  • 首先,你为什么要寻找你已经拥有的东西? myframe 已经是您正在寻找的 iframe。其次,如果您尝试访问的 iframe 与主机页面不在同一个域中,则您不太可能能够控制它。
  • 使用 javascript 设置 ID,因为 iframe 最初没有 ID。而且,它在同一个域中。我需要纠正什么才能使其正常工作?
  • 我想说的是,document.getElementsByTagName("iframe")[0] 已经是您要查找的 iframe。
  • @customcommander 那么我该如何解决这个问题呢?你能在下面写一个示例代码吗?
  • 这是什么:categorize faces...名称中有空格?这是 PHP 的特性吗?

标签: javascript iframe radio


【解决方案1】:

window.frames, .contentDocument, & .contentWindow.document

页面加载时存在 iframe(非动态)

见演示 1

假设我们引用页面上的第一个(或唯一一个)iframe:

window.frames[0]
document.getElementsByTagName('iframe')[0].contentDocument; // interchangeable
document.querySelector('iframe').contentWindow.document; // interchangeable

将上述示例中的任何三行之一存储到一个变量中,然后将该变量视为document

var iframeDoc = window.frames[0];
var iframeInput = iframeDoc.querySelector('#input2');

简而言之,就是如何通过 iframe 以编程方式将标签从父页面访问到子页面。如果涉及用户交互,例如用户单击子页面的单选按钮,则应使用 .addEventListener()Onevent Property 将 iframe 的文档注册到单击事件。

iframeDoc.addEventListener('click', eventHandler);

事件处理程序是在点击iframeDoc 时调用的函数。

function eventHandler(event) {
  console.log(event.target.value);
}

eventHandler() 传递 Event Object,然后引用属性 Event.targetevent.target 是对点击标签的直接引用(例如单选按钮)。 .value属性后缀为event.target,获取点击标签的值。


iframe 被动态插入到 DOM 中

见演示 2

当标签被动态添加到 DOM 时,它不能注册到任何事件。一种解决方法是通过注册动态标签(例如 iframe)的祖先标签(例如正文)来使用 Event Delegation 模式。 eventHandler 必须从父页面上的祖先标记“向下钻取” 到 iframe 文档中。请参阅演示 2 了解令人毛骨悚然的细节。


演示1

静态 iframe

注意:由于 SO 上的安全措施,iframe 被削弱。本演示中的 iframe 使用srcdoc 粗略表示 OP (Original Post) 代码的内容。

var xFrame = window.frames[0];

xFrame.onclick = extractValue;

function extractValue(e) {
  console.log(e.target.value);
}
&lt;iframe srcdoc='&lt;form action="/testx.php" method="POST"&gt;&lt;input type="radio" name="gender" value="male"&gt; Male&lt;br&gt;&lt;input type="radio" name="gender" value="female"&gt; Female&lt;br&gt;&lt;input type="radio" name="gender" value="other"&gt; Other&lt;br&gt;&lt;br&gt;&lt;input type="submit" value="Submit"&gt;&lt;/form&gt;'&gt;&lt;/iframe&gt;

Plunker

演示 2

动态 iframe

注意:可以通过此Plunker

查看工作演示

/* 
|| This is to simulate the iframe being dynamically inserted into the DOM.
|| This is not required for OP (Original Post) specific circumstance.
*/
document.body.insertAdjacentHTML('afterbegin', `<iframe src='test2.html'></iframe>`);

/* BEGINNING OF REQUIRED CODE */
/*
|| Register the body to the click event
|| function extractValue() is the event handler called when body is clicked.
*/
document.body.addEventListener('click', extractValue);

/* Event Handler */
/*
|| Reference the Document Object inside iframe
|| Reference the form tag inside Document Object of iframe
|| Reference all radio buttons name='gender' in the form tag
|| Reference the selected radio button
|| Log the selected radio button's value
*/
function extractValue(e) {
  var xFrame = window.frames[0];
  var xForm = xFrame.forms[0];
  var xRads = xForm.elements['gender'];
  var selected = xRads.checked;
  console.log(selected.value);
}

【讨论】:

  • 我正在尝试使用 javascript 在 iframe 中自动选择值为“female”的单选按钮。我尝试了你的两个代码,但没有一个会自动选择 iframe 中值为“female”的单选按钮。
  • 尝试在没有点击处理程序的情况下运行extractValue()。但更改最后两行:var xRads = xForm.elements['gender']; var selected = xRads.checked;var xRads = xForm.elements['gender']; var female = Array.from(xRads).filter(function(rad) { return rad.value === 'female';});
猜你喜欢
  • 2019-06-06
  • 2020-02-25
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2016-09-24
  • 2020-05-19
相关资源
最近更新 更多