Запустите JQuery в контексте другого фрейма
Клиент, с которым я работаю, имеет такой набор фреймов...
<frameset rows="100,*, 0">
<frame name="theFrame" id="theFrame" src="blah.html" >
<frame name="theSecondFrame" id="theSecondFrame" src="foo.html" >
<frame name="importantFrame" id="importantFrame" src="myFrame.html" >
</frameset>
Когда происходит какое-то действие, мне нужен мой фрейм (важный фрейм, который в настоящее время скрыт), чтобы в основном захватить страницу и заблокировать любое взаимодействие с другими кадрами. Я планирую блокировать взаимодействие с помощью плагина UI блока jquery.
Проблема в том, что я не могу изменить файлы foo.html или blah.html. Таким образом, JS-код не может там жить. Мне нужно выполнить мой код jquery в контексте этих фреймов. Поэтому просто для того, чтобы напомнить, мне нужен код JQuery для работы в myFrame.html, но выполняйте его в контексте других фреймов. Как я могу это сделать? Надеюсь, что это имеет смысл.
Спасибо
CDR
Ответы
Ответ 1
Функция jQuery
, которую вы чаще всего вызываете с помощью $
, принимает второй аргумент, называемый контекстом, который является "каким элементом DOM объекта jQuery я должен выполнять поиск". В большинстве случаев вы опускаете этот аргумент, поэтому контекст по умолчанию относится к текущему HTML-документу. Когда ваш код выполняется в iframe, документ по умолчанию использует этот документ iframe. Но вы можете легко захватить документ для одного из других кадров.
Например, поместите это в myFrame.html
, и это удалит все элементы h1 из фрейма с blah.html
в нем. Обратите внимание на второй аргумент $
, который является выражением, которое захватывает кадр blah из важного кадра:
<html>
<head>
<script type="text/javascript" src="/javascripts/jquery.js"></script>
<script type="text/javascript">
function doIt() {
$('h1', window.parent.frames[0].document).remove()
}
</script>
</head>
<body>
<h1>My Frame</h1>
<a href="#" onclick="doIt()">Do It</a>
</body>
</html>
Ответ 2
Как и pjb3, задайте контекст jQuery. Если у вас есть вложенные фреймы, ваш код будет выглядеть так:
$('*',window.parent.frames[0].frames[0].document).size();
Или, еще лучше, сделайте ярлык:
targetFrame = window.parent.frames[0].frames[0].document;
$('*',targetFrame).size();
Ответ 3
Я не уверен в блочном плагине, но не могу ухватиться за соответствующий фрейм и манипулировать им, используя "дерево фреймов", что-то вроде этого: (from importantFrame.htm)
parent.theFrame.someProperty = someValue;
например:
parent.theFrame.location.href='anotherPage.html';
Из того, что я читал, вам может понадобиться Jquery на целевой странице, но вы можете попробовать что-то вроде:
parent.theFrame.block();
или возможно:
$('#theFrame').block();
Ответ 4
В версиях jQuery >= 1.7 мы не можем получать события старым способом
Старые версии (< 1.7):
var events = $('#form').data('events');
1.7 и новее:
var events = $.fn.data($('#form'), 'events');