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





Это помогает?
http://www.quirksmode.org/js/iframe.html
Я тестировал это только в firefox, но если у вас есть что-то вроде этого:
<iframe name='myframe' id='myframe' src='http://www.google.com'></iframe>
Вы можете получить его адрес, используя:
document.getElementById('myframe').src
Не уверен, правильно ли я понял ваш вопрос, но в любом случае :)
Итак, в этом приложении есть 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, а не реальный, который был изменен пользователем или перенаправлен страницей
Вы можете получить доступ к свойству 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
Вы можете использовать Ра-Аякс и обернуть внутри iframe, например. Окно управления. Хотя в целом я не призываю людей использовать фреймы (для что-либо)
Другая альтернатива - загрузить HTML на сервер и отправить его прямо в окно как содержимое метки или чего-то еще. Посмотрите, как этот Парсер Ajax RSS загружает элементы RSS в источник, который можно загрузить здесь (открытый исходный код - LGPL)
(Отказ от ответственности; я работаю с Ра-Аяксом ...)
document.getElementById('iframeID').contentWindow.location.href
Вы вообще не можете получить доступ к междоменному местоположению iframe.
Это так просто, если браузер позволяет это. В моем ответе вы увидите точно такой же путь к DOM, который не будет работать в Safari, Chrome, Firefox 3+ или IE *, потому что это небезопасно.
Как я указал в своем ответе, это не работает, если URL-адрес в iframeID находится за пределами домена содержащего окна.
HTA работает как обычное приложение Windows.
Вы пишете HTML-код и сохраняете его как файл .hta.
Однако есть по крайней мере один недостаток: браузер не может открыть файл .hta; он обрабатывается как обычная программа .exe. Итак, если вы разместите ссылку на .hta на своей веб-странице, откроется диалоговое окно загрузки, в котором вас попросят открыть или сохранить файл HTA. Если это не проблема для вас, вы можете нажать «Открыть», и откроется новое окно (в котором нет панелей инструментов, поэтому нет кнопки «Назад», ни адресной строки, ни строки меню) .
Мне нужно было сделать что-то очень похожее на то, что вы хотите, но вместо iframes я использовал настоящий frameset.
Главная страница должна быть файлом .hta; другая должна быть обычной страницей .htm (или .php, или что-то еще) .
Вот пример HTA-страницы с 2 фреймами, где в верхнем есть кнопка и текстовое поле, содержащее URL-адрес второго фрейма; кнопка обновляет поле:
<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" в теги фреймов. Он говорит, что они тоже принадлежат программе и должны иметь доступ ко всем данным (если вы этого не сделаете, во фреймах по-прежнему будет отображаться ошибка, которая была у вас раньше).<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>
Я надеюсь, что это поможет вам и другим, кто ответит на этот вопрос. Это решило мою проблему, похоже, такая же, как у вас.
Вы можете найти дополнительную информацию здесь: http://www.irt.org/articles/js191/index.htm
Наслаждайтесь =]
БОГ, ПОМОГИТЕ НАМ, РАМКИ ВОЗВРАЩАЮТСЯ?!?!?
Я провел несколько тестов в 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. Я не тестировал другие браузеры.
Можете ли вы мне помочь? Если я использую document.getElementById("myiframe").src, я получаю начальное состояние, независимо от того, находится ли src в моем домене или нет. И если я использую document.getElementById("myiframe").documentWindow.location.href, я получаю TypeError: document.getElementById("myiframe").documentWindow is undefined. Вы знаете, почему я могу получить TypeError?
Николай, попробуйте document.getElementById ("myiframe"). ContentDocument.location .href
Мне нравится ваша идея на стороне сервера, даже если предложенная мной реализация звучит немного гетто.
Вы можете установить .innerHTML iframe для содержимого HTML, которое вы захватываете на стороне сервера. В зависимости от того, как вы это поймете, вам придется обращать внимание на относительные и абсолютные пути.
Кроме того, в зависимости от того, как захватываемая страница взаимодействует с другими страницами, это может полностью не работать (файлы cookie, установленные для захватываемой страницы, не будут работать в разных доменах, возможно, состояние отслеживается в Javascript ... Множество причин это может не сработать.)
Я не верю, что отслеживание текущего состояния страницы, которую вы пытаетесь отразить, теоретически возможно, но я не уверен. Сайт может отслеживать все, что угодно на стороне сервера, у вас не будет доступа к этому состоянию. Представьте себе случай, когда при загрузке страницы переменной устанавливается случайное значение на стороне сервера, как бы вы зафиксировали это состояние?
Эти идеи в чем-то помогают?
-Брайан Дж. Стинар-
Я использую это.
var iframe = parent.document.getElementById("theiframe");
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var currentFrame = innerDoc.location.href;
это дает вам только состояние инициализации, а не текущее состояние