js и modern

#16 2 апреля 2021 в 22:48
Lora,
Я даже не пытался создавать конструкций parent #child.
Всё равно яваскрипт не увидит родителей #button, если он не видит сам #button.
Просто смотрел в панели разработчика, кто родитель выведенного на экран элемента.
И раньше-то на выведенные аяксом элементы события плохо вешались, а теперь и вовсе не вешаются.
Если разработчики подскажут почему так — буду очень признателен.
#17 2 апреля 2021 в 22:54
Может это типа перходного периода.
#19 4 апреля 2021 в 12:57

Если разработчики подскажут почему так — буду очень признателен.

Ris
Можете перевести на наш суть проблемы?) Я так ничего и не понял, что не получается и при чём тут другой шаблон.
#20 4 апреля 2021 в 14:50
Ris,
Вроде бы в модальном окне можно использовать
  1.  
  2. <script>
  3. $('#button').on('click',function(){
  4. /* что-то */
  5. });
  6. </script>
  7.  
без буферизации
#21 4 апреля 2021 в 15:19

Можете перевести на наш суть проблемы?

Fuze
Пример проявления проблемы:
Требуется отправка комментариев по Ctrl+Enter.
Шаблон default: добавляем в низ файла \templates\default\controllers\comments\list.tpl.php
  1. <script type="text/javascript">
  2. $('textarea').on('keydown', function(event){
  3. if (event.keyCode === 10 || event.keyCode == 13 && event.ctrlKey) {
  4. icms.comments.submit();
  5. }
  6. });
  7. </script>
То есть добавляем на страницу списка комментариев яваскрипт, который по событию контрол-энтер на тексареа запускает сабмит. Всё работает.
Шаблон модерн. добавляем тот же код в тот же файл. Элемент textarea на странице присутствует, но событие $('textarea').on('keydown', function(event){ не срабатывает
Пришлось делать так:
  1. <script>
  2. document.addEventListener("DOMContentLoaded", () => {
  3. $('#comments_add_form').on('keydown', function(event){
  4. if (event.keyCode === 10 || event.keyCode == 13 && event.ctrlKey) {
  5. icms.comments.submit();}});
  6. </script>
#22 4 апреля 2021 в 16:13

$('textarea').on('keydown', function(event){ не срабатывает

Ris
И причина тому, то что ваш код заявлен раньше, чем объявлена переменная $? Или другая ошибка в консоли?
#23 4 апреля 2021 в 16:26

И причина тому, то что ваш код заявлен раньше, чем объявлена переменная $?

Loadырь
Нет, конечно же я делал ожидание загрузки страницы на чистом яваскрипте.
  1. document.addEventListener("DOMContentLoaded", () => {

Или другая ошибка в консоли?

Loadырь
А нету никаких ошибок в консоли. Как будто textarea отсутствует на странице.
Можно написать
  1. document.addEventListener("DOMContentLoaded", () => {
  2. $('textarea').on('click', function(){
  3. console.log(123456);
  4. });
  5. });
и тыкать в textarea хоть до посинения — никакой реакции.
#24 4 апреля 2021 в 17:11

Пришлось делать так:

Ris
Зачем? Надо вот так:

  1. <?php ob_start(); ?>
  2. <script>
  3. $(function(){
  4. $('textarea').on('click', function(){
  5. console.log(123456);
  6. });
  7. });
  8. </script>
  9. <?php $this->addBottom(ob_get_clean()); ?>
#25 4 апреля 2021 в 17:38

Зачем?

Fuze
Затем, что я этот код просто виджетом HTML на страницу списка комментариев вывел.
За информацию про ob_start спасибо! Сечас посмотрю, что это вообще такое…
#26 4 апреля 2021 в 20:13

Надо вот так

Fuze
Так и знал, что вы подарите нам виджет "PHP код" в коробке уже в следующем релизе! v
#27 5 апреля 2021 в 11:20

Сечас посмотрю, что это вообще такое...

Ris
Что бы понять нужно очень глубокое погружение в облость php laughИ честно сказать я так и не понял зачем он в шаблоне, если его суть именно в выводе данных в шаблон. Как я понял. И это конечно не сомнение целесообразности использования, а просто мой недостаток знания).
#28 5 апреля 2021 в 12:31
Lora,
Судя по куску кода, который привёл Fuze, и мануалам из интернетов, ob_ это output bufer.
И с содержимым этого буфера можно работать с помощью javascript перед выводом этого содержимого в браузер.
#29 5 апреля 2021 в 12:56
Ris, это просто буферизация вывода, для того, чтобы в данном случае скрипты положить вниз страницы. В модерне все js подключаются внизу страницы, поэтому инлайн js должен идти после их подключения.
Буферизацией также можно добавлять любые HTML блоки на любые позиции шаблона. Т.е. то, что идёт после ob_start() не печатается тут же в браузер, а ob_get_clean() получает всё, что было "напечатано" в коде после ob_start().
Таким образом можно, например, в шаблоне контроллера какой-то блок HTML кода вывести на позицию виджета.

  1. <?php ob_start(); ?>
  2. <div>Произвольный HTML</div>
  3. <?php $this->renderWidgetHtml('pos_name', ob_get_clean()); ?>
  4.  
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.