Могу ли я настроить таргетинг на элемент до его закрытия?

Я хочу добавить класс к тегу body, не дожидаясь загрузки DOM, но я хочу знать, будет ли применим следующий подход. Меня больше беспокоит законность, чем то, поддерживают ли ее пока браузеры.

<body>
  $("body").addClass("active");
  ...
</body>

Спасибо, Стив

Поведение ключевого слова "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) для оценки ваших знаний,...
3
0
380
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Если элемент не существует в DOM, поиск не найдет его и действие не будет применено. Если вы не можете сделать это в функции $ (document) .ready (), вы можете попробовать поместить код после элемента, на который указывает ссылка. Я верю, что это сработает.

<body>
   <div id='topStories'></div>
   <script type='text/javascript'>
     $('div#topStories').addClass('active');
   </script>
</body>

Если вам нужно добавить класс в тело, я бы обязательно использовал $ (document) .ready ().

Итак, если я вас правильно понял, вы говорите, что элемент не существует, пока он не будет закрыт. Это верно?

Steve Perks 28.10.2008 00:22

Я говорю, что это самый безопасный способ. Я бы предположил, что, поскольку элемент может быть не полностью определен (отсутствует конечный тег), браузер не будет добавлять его в DOM, пока он не будет полностью проанализирован. Однако я не могу указать на стандарт, который это обеспечивает.

tvanfosson 28.10.2008 00:46

Оценил. Я уточню еще немного и посмотрю, как я зажгу новые нейроны - ура.

Steve Perks 28.10.2008 00:49

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

<html>
<head>
    <style type = "text/css">
        .foobar { background-color: #CCC; }
    </style>
</head>
<body>
    <script type = "text/javascript">
        window.document.body.className = "foobar";
    </script>
    <div style = "border: solid 1px"><br /></div>
    <script type = "text/javascript">
    // happens before DOM is fully loaded:
        alert(window.document.body.className);
    </script>
    <span>Appears after the alert() call.</span>
</body>
</html>

В IE 7, когда происходит alert(), значение устанавливается правильно, но стиль еще не применен (он применяется быстро, как только DOM завершает загрузку).

В Firefox этот стиль был применен к моменту появления alert().

В любом случае, надеюсь, это будет вам полезно.

Это было ОЧЕНЬ полезно.

Чтобы задать вопрос немного реального мира.

Я строю с предположением, что JavaScript не поддерживается, а затем переопределяю с помощью JavaScript. Проблема в том, что когда мне нужно дождаться загрузки DOM, прежде чем мои переопределения на сайте пройдут стадию мерцания по мере его создания. Я надеюсь, что если я смогу добавить класс «active» к элементу body до загрузки остальной части сайта, я смогу применить предполагаемые стили JavaScript до того, как страница будет отрисована.

Чего я не хочу делать, так это добавлять это, а затем получать звонок, когда выходит Firefox4, что я не должен был этого делать.

Если вы посмотрите на сайт, который я создал, вы увидите, что он постепенно деградирует, но меня это беспокоит (особенно, если реклама вешает сайт). Я мог бы воспользоваться подходом других парней и просто построить его с предполагаемым JS, но давай - это просто лениво ...

@Jason, знание, что FF и IE по разному реагируют. По сути, это отвечает на мой первоначальный вопрос, но, учитывая, что Мар дал мне мое решение, я должен был воздать ему должное. Хотел бы я поделиться им :)

Steve Perks 30.10.2008 00:35

По сути, ответ отрицательный. В IE6 и Firefox 2 (браузеры, в которых я наиболее опытен) элемент отсутствует в DOM до тех пор, пока не будет завершен тег закрытия (или страница не будет отрисована для недопустимого XHTML). Я знаю, что jQuery предоставляет удобные методы, которые, кажется, достаточно быстро реагируют, чтобы избежать «мерцания» в большинстве случаев. Вы бы использовали это так:

<script>
  $(document).ready(function() {
    $("body").addClass("active");
  });
</script>
<body>
  ..
  ..
  ..
</body>

Но это все, что касается javascript.

Конечно, в приведенном вами примере вы можете легко добиться того же эффекта с помощью:

<body class = "active">
</body>
Ответ принят как подходящий

Плагин .elementReady () кажется довольно близким к тому, что вы ищете.

Он работает с использованием цикла setInterval, который завершается, как только document.getElementById() возвращает элемент для данного id.

Вероятно, вы могли бы немного изменить этот плагин (или зафиксировать обновление / патч), чтобы разрешить общие селекторы (по крайней мере, для «tagNames») вместо только id.

Я не верю, что существует действительно надежный кроссбраузерный способ адресации элемента до его загрузки - кроме такого рода взлома setInterval.

Если вы не можете разместить свою команду javascript внутри, целевой элемент, такой как @JasonBunting, предлагает.

Вместо добавления класса в тег <body> вам может быть проще добавить класс в тег <html>, выполнив:

<script type = "text/javascript">
    document.documentElement.className = 'active';
</script>

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