Как получить текущее местоположение iframe?

Я создал базовое приложение ввода данных, которое позволяет пользователям просматривать внешний контент в iframe и быстро вводить данные с той же страницы. Один из переменных данных - это URL. В идеале я хотел бы иметь возможность загружать текущий URL-адрес iframes в текстовое поле с javascript. Теперь я понимаю, что этого не произойдет из-за проблем с безопасностью.

Кто-нибудь сделал что-нибудь на стороне сервера? или знать о любом браузере .Net в элементах управления браузером. Конечная цель состоит в том, чтобы просто дать пользователю простой способ извлечения URL-адреса страницы, которую они просматривают в iframe. Это не обязательно должно быть iframe, браузер в браузере был бы идеальным.

Спасибо, Адам

Ответ 1

Я провел несколько тестов в Firefox 3, сравнивая значения .src и .documentWindow.location.href в iframe. (Примечание: documentWindow называется contentDocument в Chrome, поэтому вместо .documentWindow.location.href в Chrome это будет .contentDocument.location.href.)

src всегда является последним URL-адресом, который был загружен в iframe без взаимодействия с пользователем. I.e., оно содержит первое значение для URL-адреса или последнее значение, которое вы установили с помощью Javascript из окна, содержащего:

document.getElementById("myiframe").src = 'http://www.google.com/';

Если пользователь перемещается внутри iframe, вы больше не можете получить доступ к значению URL-адреса с помощью src. В предыдущем примере, если пользователь ушел с www.google.com, и вы выполните:

alert(document.getElementById("myiframe").src);

Вы все равно получите http://www.google.com".

documentWindow.location.href доступен только в том случае, если iframe содержит страницу в том же домене, что и содержащее окно, но если он доступен, он всегда содержит правильное значение для URL-адреса, даже если пользователь переходит в iframe.

Если вы попытаетесь получить доступ к documentWindow.location.href (или что-либо в documentWindow), а iframe находится на странице, которая не принадлежит домену содержащего окна, это приведет к возникновению исключения:

document.getElementById("myiframe").src = 'http://www.google.com/';
alert(document.getElementById("myiframe").documentWindow.location.href);
Error: Permission denied to get property Location.href

Я не тестировал другой браузер.

Надеюсь, что это поможет!

Ответ 2

document.getElementById('iframeID').contentWindow.location.href

Вы не можете получить доступ к междоменному расположению iframe вообще.

Ответ 3

HTA работает как обычное приложение Windows.
Вы пишете HTML-код и сохраняете его как .hta файл.

Однако есть, по крайней мере, один недостаток: браузер не может открыть .hta файл; он обрабатывается как нормальная программа .exe. Таким образом, если вы поместите ссылку на .hta на свою веб-страницу, откроется диалоговое окно загрузки, в котором вам будет предложено открыть или сохранить файл HTA. Если это не проблема для вас, вы можете нажать "Открыть", и он откроет новое окно (у которого нет панелей инструментов, поэтому нет кнопки "Назад", ни адресной строки, ни меню).


Мне нужно было сделать что-то очень похожее на то, что вы хотите, но вместо iframes я использовал реальный frameset.
Главная страница должна быть .hta файлом; другая должна быть нормальной .htm-страницей (или .php или что-то еще).

Здесь приведен пример страницы HTA с 2 кадрами, в верхней части которой есть кнопка и текстовое поле, содержащее второй URL-адрес кадра; кнопка обновляет поле:

frameset.hta​​h3 >

<html>
    <head>
        <title>HTA Example</title>
        <HTA:APPLICATION id="frames" border="thin" caption="yes" icon="http://www.google.com/favicon.ico" showintaskbar="yes" singleinstance="no" sysmenu="yes" navigable="yes" contextmenu="no" innerborder="no" scroll="auto" scrollflat="yes" selection="yes" windowstate="normal"></HTA:APPLICATION>
    </head>
    <frameset rows="60px, *">
        <frame src="topo.htm" name="topo" id="topo" application="yes" />
        <frame src="http://www.google.com" name="conteudo" id="conteudo" application="yes" />
    </frameset>
</html>
  • Здесь есть тег HTA:APPLICATION, который устанавливает некоторые свойства в файл; это хорошо, но это не обязательно.
  • НУЖНО разместить теги application="yes" в тегах фреймов. В нем говорится, что они принадлежат к программе и должны иметь доступ ко всем данным (если вы этого не сделаете, фреймы будут по-прежнему показывать ошибку, которую вы имели раньше).

topo.htm

<html>
    <head>
        <title>Topo</title>
        <script type="text/javascript">
            function copia_url() {
                campo.value = parent.conteudo.location;
            }
        </script>
    </head>
    <body style="background: lightBlue;" onload="copia_url()">
        <input type="button" value="Copiar URL" onclick="copia_url()" />
        <input type="text" size="120" id="campo" />
    </body>
</html>
  • Вы должны заметить, что я не использовал функцию getElement для извлечения поля; по HTA файлу, все элементы, имеющие идентификатор, мгновенно становятся объектом

Надеюсь, это поможет вам и другим, которые доберутся до этого вопроса. Он решил мою проблему, которая выглядит так же, как и у вас.

Вы можете найти дополнительную информацию здесь: http://www.irt.org/articles/js191/index.htm

Наслаждайтесь =]

Ответ 4

Мне нравится ваша идея на стороне сервера, даже если моя предлагаемая реализация этого звучит немного гетто.

Вы можете установить .innerHTML iframe в содержимое HTML, которое вы захватите на стороне сервера. В зависимости от того, как вы это захватите, вам придется обратить внимание на относительные и абсолютные пути.

Кроме того, в зависимости от того, как страница, которую вы захватываете, взаимодействует с другими страницами, это может полностью не работать (файлы cookie, установленные для страницы, которую вы захватываете, не будут работать в разных доменах, возможно, состояние отслеживается в Javascript... Множество причин это может не сработать.)

Я не считаю, что отслеживание текущего состояния страницы, которую вы пытаетесь отразить, теоретически возможно, но я не уверен. Сайт может отслеживать все виды серверной части, у вас не будет доступа к этому состоянию. Представьте себе случай, когда на загрузке страницы переменная устанавливается на случайное значение на стороне сервера, как бы вы зафиксировали это состояние?

Помогают ли эти идеи чему-либо?

-Brian J. Stinar -

Ответ 5

Я использую это.

var iframe = parent.document.getElementById("theiframe");
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

var currentFrame = innerDoc.location.href;

Ответ 6

Итак, в этом приложении есть iframe, в котором пользователю предоставляются ссылки или некоторая пропускная способность, которая позволяет iframe просматривать какой-то внешний сайт. Затем вы пытаетесь захватить URL-адрес, который просматривал пользователь.

Что-то нужно иметь в виду. Поскольку URL-адрес относится к внешнему источнику, вы будете ограничены тем, насколько вы можете взаимодействовать с этим iframe с помощью javascript (или, например, на стороне клиента), это называется безопасностью междоменной защиты браузера, поскольку, по-видимому, вы обнаружили, Есть умные работы вокруг, как представлено здесь Междоменный, межкадровый Javascript, хотя я не думаю, что в этом случае это работает.

Все, что вы можете получить, это местоположение, которое вам нужно.

Я бы предложил сделать представленный код более гибким и менее подверженным ошибкам. Попробуйте некоторое время просматривать веб-страницы с IE или FF, настроенными на отображение ошибок JavaScript. Вы будете удивлены только тем, сколько ошибок javascript выбрано, во многом потому, что существует много ошибок, подверженных ошибкам javascript, которые продолжают разрастаться.

Это решение предполагает, что рассматриваемый iframe является тем же "оконным" контекстом, в котором вы используете javascript. (Значит, он не встроен в другой фрейм или iframe, и в этом случае код javascript становится все более активным, и вам, вероятно, потребуется рекурсивно искать в иерархии окон.)

<iframe name='frmExternal' id='frmExternal' src='http://www.stackoverflow.com'></frame>
<input type='text' id='txtUrl' />
<input type='button' id='btnGetUrl' value='Get URL' onclick='GetIFrameUrl();' />

<script language='javascript' type='text/javascript'>
function GetIFrameUrl()
{
    if (!document.getElementById)
    {
        return;
    }

    var frm = document.getElementById("frmExternal");
    var txt = document.getElementById("txtUrl");

    if (frm == null || txt == null)
    {
        // not great user feedback but slightly better than obnoxious script errors
       alert("There was a problem with this page, please refresh.");
       return;
    }

    txt.value = frm.src;
}
</script>

Надеюсь, что это поможет.

Ответ 7

Вы можете использовать Ra-Ajax и иметь iframe, завернутый внутри, например. Управление окном. Хотя в общих чертах я не призываю людей использовать iframes (для чего-либо)

Другая альтернатива - загрузить HTML-код на сервер и отправить его прямо в окно как содержимое ярлыка или что-то в этом роде. Посмотрите, как этот Ajax RSS parser загружает элементы RSS в источник, который можно загрузить здесь (Open Source - LGPL)

(Отказ от ответственности, я работаю с Ra-Ajax...)

Ответ 8

Помогает ли это?

http://www.quirksmode.org/js/iframe.html

Я тестировал это только в firefox, но если у вас есть что-то вроде этого:

<iframe name='myframe' id='myframe' src='http://www.google.com'></iframe>

Вы можете получить его адрес, используя:

document.getElementById('myframe').src

Не уверен, правильно ли я понял ваш вопрос, но в любом случае:)

Ответ 9

Вы можете получить доступ к свойству src iframe, но это даст вам только исходный URL. Если пользователь перемещается в iframe, вам нужно использовать HTA для решения проблемы безопасности.

http://msdn.microsoft.com/en-us/library/ms536474(VS.85).aspx

Проверьте ссылку, используя HTA ​​и установив свойство "application" iframe, вы получите доступ к свойству document.href и проанализируйте всю необходимую информацию, включая элементы DOM и их значения, если вы так выбрать.