2010-02-02 5 views
10

Я пытаюсь сделать что-то подобное с применением Clipper здесь http://www.polyvore.com/cgi/clipperЗакрыть IFrame междоменного

я могу сделать IFrame появляться на другом сайте (кросс домена). Но я не могу заставить кнопку «закрыть» работать.

Это то, что я использовал, но он не работает для перекрестного домена (в основном удалить IFrame элемент)

window.parent.document.getElementById('someId').parentNode.removeChild(window.parent.document.getElementById('someId'));  

Можете ли вы помочь? Благодарю.

ответ

19

Вы должны использовать библиотеку, которая абстрагирует это (например, , не проверено). Обмен сообщениями с фрагментами может не работать во всех браузерах, и есть более эффективные подходы, такие как postMessage.

Однако, ваш пример (Clipper) использует взломанный номер fragment id messaging. Это может быть кросс-браузер, если страница, содержащая ваш iframe, является верхним уровнем. Другими словами, существует всего два уровня. В принципе, ребенок устанавливает фрагмент родителя, и родительский наблюдает за этим.

Это подобный подход к Машинка'S:

parent.html

<html> 
<head> 
<script type="text/javascript"> 
function checkForClose() 
{ 
    if(window.location.hash == "#close_child") 
    { 
     var someIframe = document.getElementById("someId"); 
     someIframe.parentNode.removeChild(someIframe); 
    } 
    else 
    { 
     setTimeout(checkForClose, 1000) 
    } 
} 
setTimeout(checkForClose, 1000); 
</script> 
</head> 
<body> 
<iframe name="someId" id="someId" src="child.html" height="800" width="600">foo</iframe> 
</body> 
</html> 

child.html:

<html> 
<head> 
<script type="text/javascript"> 
setTimeout(function(){window.parent.location.hash = "close_child";}, 5000); 
</script> 
<body style="background-color: blue"></body> 
</html> 

EDIT2: Междоменное и независимо друг от друга под контролем различны. Я ворвался в (сильно укоренившийся/обфусканный) код Polyvore, чтобы посмотреть, как он работает (кстати, это не в Firefox). Прежде всего помните, что букмарклеты, такие как Clipper, живут в контексте открытой страницы, когда они начинаются. В этом случае Букмарклет нагрузки a script, который, в свою очередь, запускает функцию инициализации, которая генерирует an iframe, но также работает:

Event.addListener(Event.XFRAME, "done", cancel); 

Если вы DIGG в AddListener, вы найдете (beautified):

if (_1ce2 == Event.XFRAME) { 
         if (!_1cb3) { 
          _1cb3 = new Monitor(function() { 
           return window.location.hash; 
          }, 
          100); 
          Event.addListener(_1cb3, "change", onHashChange); 
         } 
        } 

отменить включает в себя:

removeNode(iframe); 

Теперь, единственный оставшийся кусок, что iframe page нагрузки another script с функцией ClipperForm.init, которая включает в себя:

Event.addListener($("close"), "click", function() { 
      Event.postMessage(window.parent, _228d, "done"); 
     }); 

Итак, мы ясно видим, что они используют фрагмент ID сообщений.

+0

Это слишком сложно выше, что мне нужно. Мне нужно только закрыть iframe. Любой простой способ сделать это? Если нет, можете ли вы показать пример, как это делается?Спасибо –

+0

Хотя у меня нет контроля над родительским документом. Вот почему я сказал «кросс-домен». Подобно примеру Polyvore, они не контролируют родителя, но они все равно могут закрыть iframe. Странный! –

+0

Как я только что объяснил выше, они/do/управляют родителем, и они/есть/используют обмен фрагментами ID. –

1

Попробуйте скрывать содержимое iframe и не беспокойтесь о том, чтобы действительно избавиться от элемента iframe в родительском.

+0

Как скрыть? Я получил эту ошибку Разрешение отклонено для , чтобы получить свойство Window.document из . Так что в принципе я не могу найти способ сделать что-либо с iframe –

+0

. Я думаю, если вы установите document.style.visibility = none (или, тем не менее, можете скрыть все содержимое iframe) на вещи внутри iframe, вы все равно получите большой белый квадрат? В этом случае вам, вероятно, нужен какой-то механизм межкадровой связи, как предлагает Мэтью Флашен. В то же время вы вводите сам iframe, вы также вводите скрипт для обработки одной стороны сообщения; и страница, загруженная внутри iframe, имеет скрипт для обработки другой стороны. – Bruce

+0

Попробуйте отобразить: none –

Смежные вопросы