JQuery и фреймы - $(document).ready не работает

У меня есть страница с некоторым кодом в js и jQuery, и она работает очень хорошо. Но, к сожалению, весь мой сайт очень старый, и использует фреймы. Поэтому, когда я загружал свою страницу внутри фрейма, $(document).ready() не запускается.

Мой набор фреймов выглядит так:

<frameset rows="79,*" frameBorder="1" frameSpacing="1" bordercolor="#5996BF" noresize> 
    <frame name="header" src="Operations.aspx?main='Info.aspx'" marginwidth="0" marginheight="0" scrolling="no" noresize frameborder="0">
    <frame name="main" src="Info.aspx" marginwidth="0" marginheight="0" scrolling="auto" noresize frameborder="0">      
</frameset>

Моя страница загружается в рамку main. Что мне делать?

Ответы

Ответ 1

Я попробовал метод, упомянутый в другом комментарии:

$("#frameName").ready(function() {
    // Write you frame on load javascript code here
} );

и это не сработало для меня.

это:

$("#frameName").load( function() {
     //code goes here
} );

Даже при том, что событие не срабатывает так быстро - оно ожидает, пока загрузятся изображения и css.

Ответ 2

Если вы хотите запустить событие onload для своих фреймов, выполните следующие действия:

  • Назначьте id и name для каждого тега <frame>. Убедитесь, что значения атрибутов id и name одинаковы.

  • Используйте следующий код для запуска события onload кадра:

    $("frameName").ready(function() { 
      // Write your frame onload code here
    }
    

Ответ 3

Я предполагаю, что это аналогичная проблема, с которой я столкнулся с DOMContentLoaded в iframe.

Я написал сообщение в блоге об этом.

Ответ 4

Я знаю, что это старая тема. Но чтобы помочь некоторым из вас, кто достигает этой страницы, вот мое решение:

$($("#frameName")[0].contentWindow.document).ready(function() {
    // Write you frame onready code here
});

Ответ 5

Вы пытались поместить код jQuery на страницу Info.aspx?

Ответ 6

Для меня также работало следующее:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
<script>
$(window.parent.frames[0].document).ready(function() {
    // Do stuff
});
</script>

[0] указывает, что это первый кадр в документе, [1] будет вторым фреймом и т.д. Это особенно приятно, если вы не контролируете надпись и все еще используете документ.

Ответ 7

Я долгое время работал с этим сообщением... вот мое решение.

test.html

<!DOCTYPE HTML>
<html>
<head>
    <script src="http://code.jquery.com/jquery-latest.js"></script>

    <script>        
      document.write('<frameset><frame name="frame_content" id="frame_content"></frame></frameset>');

      $('#frame_content').attr('src', 'test2.html');
      $('#frame_content').load(function()
      {
        if('${"#header"}' != '') {
          $("#header", frame_content.document).remove();
        }
      });
      if($('#frame_content').complete) $('#frame_content').trigger("load");
    </script>

</head>
</html>

test2.html

<!DOCTYPE HTML>
<html>

  <head>
  </head>

  <body>
    <div id="header">You will never see me, cause I have been removed!</div>
  </body>
</html>

Ответ 8

Я не знаю, является ли это лучшим решением, но когда я удаляю $(document).ready() и сохраняю его тело, все работает отлично.

Ответ 9

Не уверен, что вы пытаетесь сделать, но у меня есть еще более старое классическое приложение asp, которое работает из фреймов, и я недавно добавил функциональность jQuery, и он отлично работает. $(Document).ready() отлично работает внутри фрейма, но если вы хотите ссылаться на DOM в другом фрейме, вам нужно будет использовать событие Frame onload, чтобы вы знали, когда загружается DOM файл. По общему признанию, я использовал iFrames, но концепция должна быть одинаковой.

Ответ 10

Не нужно изменять разметку. Просто исправьте селектор. Это должно быть:

$("frame[name='main']").ready(function(){..}); 

not

$("#frameName").ready(function(){..}); 

Примечание. Кажется, что событие jQuery ready срабатывает несколько раз. Убедитесь, что все в порядке с вашей логикой.

Ответ 11

Этот ответ может быть запоздалым, но этот ответ может помочь кому-то вроде меня...

Это можно сделать через собственный код Javascript -

ifrm2 = var ifrm2 = document.getElementById('frm2');
if (ifrm2.contentDocument.readyState == 'complete') {
  //here goes the code after frame fully loaded
}

 //id = frm2 is the id of iframe in my page

Ответ 12

Нет причин для $(document).ready() не вызываться. Убедитесь, что ваша страница содержит include в jquery.js. Попробуйте выполнить простой тест с пустой HTML-страницей и просто оповещение, чтобы увидеть, есть ли другая проблема.

Если вы пытаетесь использовать это на странице HTML, содержащей определение фрейма, имейте в виду, что там нет документа, вам нужно будет использовать