Как мне узнать текущее местоположение iframe? - PullRequest
46 голосов
/ 04 сентября 2008

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

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

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

Ответы [ 9 ]

50 голосов
/ 07 августа 2009

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

src - это всегда последний URL, который был загружен в iframe без участия пользователя. То есть, оно содержит первое значение для 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

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

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

17 голосов
/ 20 марта 2009
document.getElementById('iframeID').contentWindow.location.href

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

1 голос
/ 21 июля 2013

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

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

var currentFrame = innerDoc.location.href;
1 голос
/ 31 августа 2010

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

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

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

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

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

-Брайан Дж. Стинар-

1 голос
/ 07 мая 2009

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

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

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

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

frameset.hta

<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

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

0 голосов
/ 02 декабря 2008

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

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

(Отказ от ответственности; я работаю с Ра-Аяксом ...)

0 голосов
/ 02 декабря 2008

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

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

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

0 голосов
/ 06 сентября 2008

Хорошо, поэтому в этом приложении есть 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>

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

0 голосов
/ 05 сентября 2008

Это помогает?

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

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

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

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

document.getElementById('myframe').src

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...