Ответ 1
Я решил это, сделав вот так:
$('#filecontainer').load(function(){
var iframe = $('#filecontainer').contents();
iframe.find("#choose_pics").click(function(){
alert("test");
});
});
Я пишу плагин для TinyMCE и имею проблему с обнаружением событий click внутри iframe.
Из моего поиска я придумал следующее:
Загрузка iframe:
<iframe src='resource/file.php?mode=tinymce' id='filecontainer'></iframe>
HTML внутри iframe:
<input type=button id=choose_pics value='Choose'>
JQuery
//Detect click
$("#filecontainer").contents().find("#choose_pic").click(function(){
//do something
});
Другие сообщения, которые я видел, обычно имеют проблемы с разными доменами (это не так). Но, тем не менее, событие не обнаружено.
Можно ли сделать что-то подобное?
Я решил это, сделав вот так:
$('#filecontainer').load(function(){
var iframe = $('#filecontainer').contents();
iframe.find("#choose_pics").click(function(){
alert("test");
});
});
Я не уверен, но вы можете просто использовать
$("#filecontainer #choose_pic").click(function() {
// do something here
});
Либо это, либо вы можете просто добавить тэг <script>
в iframe (если у вас есть доступ к внутреннему коду), а затем использовать window.parent.DoSomething()
в кадре с кодом
function DoSomething() {
// do something here
}
в родительском.
Если ни одна из них не работает, попробуйте window.postMessage
. Вот некоторая информация об этом.
API-интерфейс tinymce заботится о многих событиях в редакторе iframe. Я настоятельно рекомендую их использовать. Вот пример обработчика кликов
// Adds an observer to the onclick event using tinyMCE.init
tinyMCE.init({
...
setup : function(ed) {
ed.onClick.add(function(ed, e) {
console.debug('Iframe clicked:' + e.target);
});
}
});
Просто публиковать в случае, если это помогает кому-то. Для меня следующий код работал отлично:
$(document).ready(function(){
$("#payment_status_div").hide();
var iframe = $('#FileFrame').contents();
iframe.find("#take_payment").click(function(){
$("#payment_status_div").show("slow");
});
});
Где "FileFrame" - это идентификатор iframe, а "take_payment" - это кнопка внутри iframe. Поскольку моя форма внутри iframe отправляется в другой домен, при использовании нагрузки я получил сообщение об ошибке:
Заблокировано кадр с источником " https://www.example.com" от доступа к кадру с исходным кодом https://secure-test.worldpay.com". Протоколы, домены и порты должны соответствовать.
Я знаю, что это старый, но ID не соответствует вашему коду: select_pic, а один выберите_pics:
<input type=button id=choose_pics value='Choose'>
$("#filecontainer").contents().find("#choose_pic").click(function(){
//do something
});
$("#iframe-id").load( function() {
$("#iframe-id").contents().on("click", ".child-node", function() {
//do something
});
});
В моем случае два jQuery, для внутреннего и внешнего HTML. У меня было четыре шага, прежде чем я мог приложить внутренние события:
$(function() { // 1. wait for the outer jQuery to be ready, aka $(document).ready
$('iframe#filecontainer').on('load', function() { // 2. wait for the iframe to load
var $inner$ = $(this)[0].contentWindow.$; // 3. get hold of the inner jQuery
$inner$(function() { // 4. wait for the inner jQuery to be ready
$inner$.on('click', function () { // Now I can intercept inner events.
// do something
});
});
});
});
Хитрость заключается в использовании внутреннего jQuery для присоединения событий. Обратите внимание, как я получаю внутренний jQuery:
var $inner$ = $(this)[0].contentWindow.$;
Мне пришлось выкинуть jQuery в объектную модель для него. Подход $('iframe').contents()
в других ответах не работал в моем случае, потому что он остается с внешним jQuery. (И, кстати, возвращает contentDocument
.)
Если кто-то заинтересован в "быстрой воспроизводимой" версии принятого ответа, см. ниже. Кредиты другу, которого нет на SO. Этот ответ также может быть интегрирован в принятый ответ с редактированием,... (Он должен запускаться на локальном сервере).
<html>
<head>
<title>SO</title>
<meta charset="utf-8"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<style type="text/css">
html,
body,
#filecontainer {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<iframe src="http://localhost/tmp/fileWithLink.html" id="filecontainer"></iframe>
<script type="text/javascript">
$('#filecontainer').load(function(){
var iframe = $('#filecontainer').contents();
iframe.find("a").click(function(){
var test = $(this);
alert(test.html());
});
});
</script>
</body>
</html>
fileWithLink.html
<html>
<body>
<a href="#" onclick="location.href='https://stackoverflow.com/'; return false;">SOreadytohelp</a>
</body>
</html>