获取 iframe 内输入字段的值

IT技术 javascript html iframe
2021-01-28 01:50:17

我仅使用 Javascript 创建表单。我正在尝试使用 Javascript 来获取iframe. 是否可以获取iframe?内的字段的值

4个回答

是的,即使该站点来自另一个域,也应该是可能的。

例如,在我网站的 HTML 页面中,我有一个 iFrame,其内容来自另一个网站。iFrame 内容是单个选择字段。

我需要能够读取我网站上的选定值。换句话说,我需要在我自己的应用程序中使用来自另一个域的选择列表。我无法控制任何服务器设置。

因此,最初我们可能会想做这样的事情(简化):

我网站中的 HTML:

<iframe name='select_frame' src='http://www.othersite.com/select.php?initial_name=jim'></iframe>
<input type='button' name='save' value='SAVE'>

iFrame 的 HTML 内容(从select.php另一个域加载):

<select id='select_name'>
    <option value='john'>John</option>
    <option value='jim' selected>Jim</option>
</select>

jQuery:

$('input:button[name=save]').click(function() {
    var name = $('iframe[name=select_frame]').contents().find('#select_name').val();
});

但是,当我尝试读取值时收到此 javascript 错误:

封闭原点“的帧http://www.myownsite.com访问的帧与原籍”“ http://www.othersite.com ”。协议、域和端口必须匹配。

为了解决这个问题,似乎可以间接源的iFrame在自己的网站从脚本,并让该脚本使用的方法一样,从其他网站读取其中的内容file_get_contents()curl等。

因此,select_local.php在您自己的站点上创建一个脚本(例如:在当前目录中),内容类似于:

select_local.php 的 PHP 内容:

<?php
    $url = "http://www.othersite.com/select.php?" . $_SERVER['QUERY_STRING'];
    $html_select = file_get_contents($url);
    echo $html_select;
?>

还要修改 HTML 以调用此本地(而不是远程)脚本:

<iframe name='select_frame' src='select_local.php?initial_name=jim'></iframe>
<input type='button' name='save' value='SAVE'>

现在您的浏览器应该认为它正在加载来自同一域的 iFrame 内容。

我喜欢它原来的样子。:)
2021-03-17 01:50:17
对于那些阅读本文并像我一样思考的人来说,如果需要身份验证,则不允许读取与特定用户相关的标记。例如,某人无法在他们的页面上隐藏 iframe、请求我的 Facebook 页面并从中抓取信息 b/c 我的会话信息 (cookie) 不为 select_local.php(非 Facebook 服务器)所知,并且它无法模拟我的与 Facebook 的会话。
2021-03-20 01:50:17
但是@butallmj 根据 Stefan select_local.php 将能够从 iFrame 之外的输入字段传递值。这是一个漏洞,因为如果有人能够在 iframe 中的 facebookk.com 上加载 facebook.com,他们就可以窃取您的凭据。
2021-03-23 01:50:17
不,这是不可能的。这个答案是不正确的,说明它是。这是一种解决方法,通过使用 PHP。基于 JS/jQuery,这是不可能的!
2021-04-01 01:50:17
@Stefan 好吧,我在这个话题上花了 5 个小时。想法是从嵌入视频页面获取内容。因为流将仅在主机域上创建。所以为了启动一个有效的会话令牌,我计划制作一个假的 iframe 并从中获取内容。这是不可能的。我真的不再需要那个解决方案了,但如果你能弄清楚如何从 iframe 中获取内容,即来自其他域的内容......只使用 JS/jQuery,我会给你买两箱啤酒。
2021-04-10 01:50:17
<iframe id="upload_target" name="upload_target">
    <textarea rows="20" cols="100" name="result" id="result" ></textarea>
    <input type="text" id="txt1" />
</iframe>

您可以通过 JQuery 获取value

$(document).ready(function(){
  alert($('#upload_target').contents().find('#result').html());
  alert($('#upload_target').contents().find('#txt1').val());
});

仅在同一个域链接上工作

document.getElementById("idframe").contentWindow.document.getElementById("idelement").value;
浏览器将阻止 JavaScript 访问跨域框架。
2021-03-19 01:50:17

没有 Iframe 我们可以通过 JQuery 来做到这一点,但它只会给你 HTML 页面源代码,不会显示动态链接或 html 标签。几乎与 php 解决方案相同,但在 JQuery 中:) 代码---

var purl = "http://www.othersite.com";
$.getJSON('http://whateverorigin.org/get?url=' +
    encodeURIComponent(purl) + '&callback=?',
    function (data) {
    $('#viewer').html(data.contents);
});
同样的事情可以使用普通的 http 请求来实现,而不必产生额外的库,因为在这种情况下没有任何好处。尽管如此,它仍然没有检索任何动态内容,也不是问题的答案。
2021-03-16 01:50:17
由于浏览器安全限制,大部分 Ajax 请求都遵循同源策略;请求无法从不同的域、子域、端口或协议成功检索数据。
2021-03-30 01:50:17