Подтвердить что ты не робот

Запустите 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

4b9b3361

Ответ 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');