2013-05-04 5 views
2

Я могу запустить событие в области родительского окна из iframe и прослушать, но я не могу запустить событие из iframe в области Функция Iframe и слушать его в родительских окнах .. Например, в родительском окне, у меня есть IFRAME и некоторые JQuery код для прослушивания событий, запущенных в этом телеПожарайте событие jquery в iframe, запустите обратный вызов в родительском окне

<iframe id="myframe" src="/vf-install.php" width="500" height="500"></iframe> 
jQuery('#myframe').contents().find("body").on('foo',function(){ 
    alert('foo'); 
}); 

в IFRAME я огонь событие:

<script type="text/javascript">jQuery("body").trigger("foo");</script> 

У меня не срабатывает мое событие. Как примечание стороны, я могу вызвать событие в родительском окне из фрейма, как это:

parent.jQuery("body").trigger("foo"); 

Это неприемлемо для меня, хотя. Обоснованием является vf-install.php, который включается через iframe, является установщиком для моей программы. Я пишу регрессионный тест с qUnit, который включает мой установщик в iframe, нажимает кнопку установки, а затем, когда установщик завершен (событие запущено), тест сделает утверждение. Таким образом, единственный раз, когда он включается через iframe, находится под контролем. Фактические пользователи вызывают страницу напрямую, и я не хочу, чтобы она запускала события в родительском окне, которого там нет.

Также в качестве примечания стороны я попытался подключить прослушиватель событий к телу iframe, когда вызывается функция load(), если это проблема, связанная с «живым запросом» (события не привязаны после того, как ajax изменяет страницу) :

jQuery('#myframe').load(function(){ 
    // attach the event listener like above 
}); 

ответ

1

Не могли бы вы написать общий обработчик для нажатия событий?

function triggerEvent(eventName) { 
if(underTest == true) { 
parent.jQuery("body").trigger(eventName); 
} 
else { 
    jQuery("body").trigger(eventName); 
} 

Тогда вы можете просто вызвать метод triggerEvent в вашем коде, и ваши тесты установить переменную «underTest» истинно, или вместо того, чтобы иметь глобальные переменные, проверьте, чтобы увидеть, если ваш тест Жгут присутствует?

Это решение не кажется слишком красивым, но оно может выполнить эту работу.

0

вы можете использовать функцию привязки:

jQuery("#yourFrameID").bind("load", function() { 
    var res = jQuery(this).contents().find('body').html().toString(); 
    //do something with the response 
}); 
Смежные вопросы