Заставить любой HREF в IFrame использовать его родителя как цель - PullRequest
2 голосов
/ 04 августа 2009

В настоящее время я использую IFrame для песочницы пользовательского контента на веб-сайте. Это устраняет любые проблемы с оформлением наших основных таблиц стилей.

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

Есть ли способ перехватить HREF внутри IFrame, чтобы они все предназначались для родителя, не изменяя их? Или использовать немного Javascript, который может быть введен повсеместно, чтобы мне не приходилось просматривать весь контент и заменять цель программно?

В идеале лучшим сценарием будет простой скрипт в одном месте.

Мысли

КОНЕЦ РЕШЕНИЯ

Я использовал вариант ответа, который выбрал ... Он направил меня в правильном направлении.

<script>
  Event.observe(window, 'load', function() {
    $$('a').each(function(e) {
      e.writeAttribute('target', '_parent');
    });
  });
</script>

Это внутри IFrame с содержанием. Это оказалось самым простым решением для задачи.

Ответы [ 4 ]

2 голосов
/ 04 августа 2009

Тот же домен в 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 они представляют собой некоторые средства защиты от фреймов, граничащих с сайтами (представьте себе вредоносную рамку вокруг сайта банка, и вы поймете, почему).

2 голосов
/ 04 августа 2009

Используйте его, чтобы создать, и у вас будет доступ к любым частям с переменной $ 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

0 голосов
/ 18 марта 2015

Самый простой ответ:

<head>
    <base target="_blank">
</head>
0 голосов
/ 12 ноября 2011

Я справился с проблемой кросс-доменов через 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.

...