Заставьте любой HREF в IFrame использовать его родительский файл в качестве целевого
-
22-07-2019 - |
Вопрос
В настоящее время я использую IFrame для изолированной обработки пользовательского контента на веб-сайте.Это устраняет любые проблемы с нашими основными таблицами стилей.
Однако, когда пользователь создает ссылку с помощью нашего текстового редактора, мы хотели бы, чтобы ссылка открывалась в родительском файле, а не просто в IFrame.Я понимаю, что вы можете установить цель для родительского элемента, но мы не контролируем пользователя и то, что он вводит в свой контент.
Есть ли какой-нибудь способ перехватить HREFS внутри IFrame, чтобы все они были нацелены на родительский файл без их изменения?Или использовать немного Javascript, который можно было бы внедрить универсально, чтобы мне не нужно было перебирать весь контент и программно заменять целевой файл?
В идеале лучшим решением был бы простой скрипт в одном месте.
Мысли?
КОНЕЧНОЕ РЕШЕНИЕ
Я использовал вариант выбранного мной ответа...Это направило меня в правильном направлении.
<script>
Event.observe(window, 'load', function() {
$$('a').each(function(e) {
e.writeAttribute('target', '_parent');
});
});
</script>
Это находится внутри IFrame с содержимым.В итоге это оказалось самым простым решением поставленной задачи.
Решение
Используйте это для его создания, и у вас будет доступ к любым частям с переменной $body:
$(function() {
var $frame = $('<iframe style="width:200px; height:100px;">');
$('body').html( $frame );
setTimeout( function() {
var doc = $frame[0].contentWindow.document;
var $body = $('body',doc);
$body.html('<h1>Test</h1>');
}, 1 );
});
Таким образом, вы можете сделать что-то вроде этого
$('a', $body).attr('target', '_parent');
Найдено здесь: http://groups.google.com/group/jquery-en/browse_thread/thread/fb646741a6192540
Другие советы
Тот же домен в iframe?ДА.
<script type="text/javascript">
function hijacklinks(iframe){
var as = iframe.contentDocument.getElementsByTagName('a');
for(i=0;i<as.length;i++){
as[i].setAttribute('target','_parent');
}
}
</script>
<iframe src="http://example.com/test.html" onload="hijacklinks(this)"></iframe>
Другой домен в iframe?Нет.
<iframe src="http://www.google.com/search?q=google+happy" onload="hijacklinks(this)"></iframe>
выдает "Отказано в разрешении на получение свойства HTMLDocument.getElementsByTagName".
Могут быть обходные пути, но, по крайней мере, с помощью простого JavaScript они обеспечивают некоторую защиту от взлома iframes сайтов (представьте вредоносный фрейм вокруг веб-сайта банка, и вы поймете, почему).
Я решил проблему с междоменностью с помощью ajax..
function runAjaxDone(response) {
$('body').html(response);
}
function callAjax(url) {
$.ajax({ url: url + '&r=' + Math.random(), success: runAjaxDone });
return false;
}
<a runat="server" href="#"
onclick='<%# "callAjax(\"http://partners.thevoiceinternet.com/portal/Customer/Report/AgentReport.aspx?AgentID="+Eval("AgentID").ToString()+"&name="+Server.UrlEncode(Eval("SubAgentName").ToString())+"\"); return false;" %>'>
<asp:Label ID="lbl" runat="server" Text='<%# Eval("SubAgentName") %>'></asp:Label></a>
Поскольку доступ к родительскому фрейму невозможен, я заменил тело через ajax.
Самый простой ответ:
<head>
<base target="_blank">
</head>