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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
49
0
114 389
9

Ответы 9

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

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

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

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

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

document.getElementById('myframe').src

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

это дает вам только состояние инициализации, а не текущее состояние

annakata 22.12.2008 13:53

Итак, в этом приложении есть 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>

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

не работает .. Я тестировал это, но, похоже, всегда возвращал "исходный" src, а не реальный, который был изменен пользователем или перенаправлен страницей

Tom 25.08.2009 11:04

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

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

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

HTA - это только расширения IE afaik

annakata 22.12.2008 13:56

Вы можете использовать Ра-Аякс и обернуть внутри iframe, например. Окно управления. Хотя в целом я не призываю людей использовать фреймы (для что-либо)

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

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

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

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

Это так просто, если браузер позволяет это. В моем ответе вы увидите точно такой же путь к DOM, который не будет работать в Safari, Chrome, Firefox 3+ или IE *, потому что это небезопасно.

Anthony 24.08.2009 11:23

Как я указал в своем ответе, это не работает, если URL-адрес в iframeID находится за пределами домена содержащего окна.

Joaquin Cuenca Abela 06.07.2012 13:49

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

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

БОГ, ПОМОГИТЕ НАМ, РАМКИ ВОЗВРАЩАЮТСЯ?!?!?

Rafael Herscovici 13.02.2013 17:20

Я провел несколько тестов в 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

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

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

Спасибо за внимание, Билли, я обновил ответ с инструкциями о том, как получить доступ к href в Chrome. Я не тестировал другие браузеры.

Joaquin Cuenca Abela 02.06.2011 19:44

Можете ли вы мне помочь? Если я использую document.getElementById("myiframe").src, я получаю начальное состояние, независимо от того, находится ли src в моем домене или нет. И если я использую document.getElementById("myiframe").documentWindow.location.‌​href, я получаю TypeError: document.getElementById("myiframe").documentWindow is undefined. Вы знаете, почему я могу получить TypeError?

Nikolay 17.02.2012 07:01

Николай, попробуйте document.getElementById ("myiframe"). ContentDocument.location‌ .href

Joaquin Cuenca Abela 25.02.2012 14:12

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

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

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

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

Эти идеи в чем-то помогают?

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

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

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

var currentFrame = innerDoc.location.href;

Другие вопросы по теме