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. Что я должен делать?

Где твой JavaScript? В "основном" фрейме или во фреймсете?

Tomalak 21.10.2008 12:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
16
1
57 772
12

Ответы 12

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

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

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

@BrianG frame src - это Operations.aspx?main='Info.aspx

Gogol 08.03.2017 11:25

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

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

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

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

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

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

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

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

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

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

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

это сделал:

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

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

Для ясности это должно быть $ ("# frameName").

HertzaHaeon 23.06.2011 00:34

Селектор должен быть: $ ("frame [name = 'main']"), а не $ ("# frameName").

Edward Olamisan 26.11.2014 05:55

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

<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] будет вторым фреймом и так далее. Это особенно удобно, если у вас нет контроля над разметкой, а документ все еще используется.

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

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>

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

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

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

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

нет

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

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

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

Это можно сделать с помощью собственного кода 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

Другие вопросы по теме