Заставьте любой HREF в IFrame использовать его родительский файл в качестве целевого

StackOverflow https://stackoverflow.com/questions/1225245

Вопрос

В настоящее время я использую 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top