У меня есть страница (index.htm), которая содержит iframe (iframe.htm) из того же домена.
Внутри iframe есть элемент textarea, который обрабатывает свое событие "change".
На главной странице есть код jquery, который изменяет содержимое textarea с помощью val(). Затем я пытаюсь запустить событие "change", вызывающее функцию change().
Однако это не работает. Изменение значения, но событие "change" не работает. Это работает, как и ожидалось, если textarea не находится внутри iframe.
ВОПРОС: как принудительно инициировать событие на элементе внутри iframe?
iframe.htm:
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script>
$(document).ready(function () {
$("textarea").bind("change", function () {
alert("changed"); });
});
</script>
</head>
<body>
<textarea id="txt"></textarea>
</body>
</html>
index.htm:
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script>
$(document).ready(function () {
$("#btn").bind("click", function () {
var frame = document.getElementById("frame");
var txt = frame.contentDocument.getElementById("txt");
$(txt).val("hello").change();
});
});
</script>
</head>
<body>
<iframe id="frame" src="iframe.htm"></iframe>
<button id="btn">Fire change</button>
</body>
</html>
Я решил это. Проблема в том, что с использованием iframe у нас есть другой экземпляр jQuery внутри. Чтобы запустить событие, следует обратиться к этому экземпляру jQuery, помещенному в iframe, вместо родительского.
Поэтому вместо
$(txt).val("hello").change();
просто используйте
frame.contentWindow.$(txt).val("hello").change();
Надеюсь, это поможет кому-то. Я потратил несколько часов на поиски причины этой ошибки :)
попробуй это:
$iframe = $('#iframe').contents().find('#txt');
$iframe.on('change',function(){
var val = $(this).val();
console.log(val);
});
$('#btn').click(function(){
$iframe.trigger('change');
});