Быстрый старт Flutter-разработчика

На нашем сайте вы можете читать онлайн «Быстрый старт Flutter-разработчика». Эта электронная книга доступна бесплатно и представляет собой целую полную версию без сокращений. Кроме того, доступна возможность слушать аудиокнигу, скачать её через торрент в формате fb2 или ознакомиться с кратким содержанием. Жанр книги — Знания и навыки, Компьютерная литература, Книги о компьютерах. Кроме того, ниже доступно описание произведения, предисловие и отзывы читателей. Регулярные обновления библиотеки и улучшения функционала делают наше сообщество идеальным местом для любителей книг.

0 баллов
0 мнений
12 чтений

Дата выхода

16 декабря 2019

Краткое содержание книги Быстрый старт Flutter-разработчика, аннотация автора и описание

Прежде чем читать книгу целиком, ознакомьтесь с предисловием, аннотацией, описанием или кратким содержанием к произведению Быстрый старт Flutter-разработчика. Предисловие указано в том виде, в котором его написал автор (Андрей Алеев) в своем труде. Если нужная информация отсутствует, оставьте комментарий, и мы постараемся найти её для вас. Обратите внимание: Читатели могут делиться своими отзывами и обсуждениями, что поможет вам глубже понять книгу. Не забудьте и вы оставить свое впечатие о книге в комментариях внизу страницы.

Описание книги

В этой книге даны необходимые элементы, база, которую нужно знать Flutter-разработчику, чтобы писать кросс-платформенные мобильные приложения под Android и iOS на языке Dart. Все это представлено в наглядной форме, на практических примерах, в формате уроков. После их освоения вы сможете именовать себя Flutter-разработчиком. Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC.

Быстрый старт Flutter-разработчика читать онлайн полную книгу - весь текст целиком бесплатно

Перед вами текст книги, разбитый на страницы для удобства чтения. Благодаря системе сохранения последней прочитанной страницы, вы можете бесплатно читать онлайн книгу Быстрый старт Flutter-разработчика без необходимости искать место, на котором остановились. А еще, у нас можно настроить шрифт и фон для комфортного чтения. Наслаждайтесь любимыми книгами в любое время и в любом месте.

Текст книги

Шрифт
Размер шрифта
-
+
Межстрочный интервал

Подробнее про язык Dart мы поговорим во второй лекции, а про виджеты – в третьей.

Итак, слева мы видим дерево проекта, справа – редактор.

Код main. dart только что созданного проекта

Весь общий для Android и iOS код находится в папке lib. Сейчас у нас там только файл main. dart

Android Studio сгенерировала простую логики инкрементирования счетчика, мы ее пока удалим, чтобы она нас не путала, и заменим на более простой вариант

Жмите на иконку молнии – Hot Reload – для применения изменений.

Надо отметить, что Hot Reload во Flutter работает действительно быстро и значительно сокращает время разработки.

Ура, на экране вы должны увидеть «Привет, Мир!».

«Привет, Мир!» на эмуляторе

Рассмотрим код подробнее. Как уже говорилось выше, MyApp наследуется от StatelessWidget, это неизменяемый UI компонент-виджет. Вообще, все во Flutter – это виджеты, и приложение тоже. В виджете мы переопределяем метод build, в котором указывается, что и как отрисовать.

В нашем примере мы возвращаем объект MaterialApp, который создаем посредством конструктора. А в конструктор передаем название, тему и виджет home, которому назначаем Scaffold – скелет приложения, который в свою очередь содержит appBar и body. Здесь уместна аналогия с HTML, где также есть тэги и <body>. </p> <p> </p> <p> </p> <p> </p> <p>Давайте немного увеличим текст и поиграем цветами: </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Виджету Scaffold мы задали красный фон, а виджету текста применили стиль, чтобы сделать его больше и заметнее.<div class="ad3"> <div id="adfox_176227590403774052"></div> <script> window.yaContextCb.push(()=>{ Ya.adfoxCode.create({ ownerId: 1451303, containerId: 'adfox_176227590403774052', params: { p1: 'cxbbb', p2: 'iazu', pfc: 'hezce', pfb: 'bhvpgf' } }) }) </script> </div> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Привет, Мир! на Андроид </p> <p> </p> <p> </p> <p> </p> <p>Преимущество Flutter в том, что вся логика работы с внешним видом приложения (UI) прописывается в коде на том же языке, что и бизнес-логика – на dart. Нет необходимости залезать в папку с ресурсами и редактировать xml верстку. </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Запускаем Hello World на iOS </p> <p> </p> <p> </p> <p>Мы же пишем кроссплатформенный код! Давайте запустим созданное приложение на iOS-девайсе. Для этого просто выберите подключенный iOS-девайс или эмулятор в dropdown-списке и нажмите «Запустить».<div class="ad4"> <div id="adfox_176227594960934052"></div> <script> window.yaContextCb.push(()=>{ Ya.adfoxCode.create({ ownerId: 1451303, containerId: 'adfox_176227594960934052', params: { p1: 'cxbbb', p2: 'iazu', pfc: 'hezce', pfb: 'bhvpgg' } }) }) </script> </div> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Выбор эмулятора iOS </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Привет, Мир! на iOS </p> <p> </p> <p> </p> <p> </p> <p>Экран выглядит потрясающе, однако вверху экрана мешается ненужная иконка debug, да и иконка приложения сейчас никакая. Исправим это. </p> <p> </p> <p>Для того, чтобы убрать ленточку debug, в добавьте в MaterialApp флаг debugShowCheckedModeBanner со значением false </p> <p> </p> <p> return MaterialApp ( </p> <p> debugShowCheckedModeBanner: false, </p> <p> </p> <p>Чтобы поменять иконку, нужно добавить в pubspec.</p> </div> <div class="pagination" style="display: flex; justify-content: center; margin-top: 30px;"> <div class="nextpage" style="display: flex;"><a href="448482-bystryj-start-flutter-razrabotchika-page5.html#reader" rel="nofollow" class="button">Назад</a></div> <div class="nextpage" style="display: flex;"><a href="448482-bystryj-start-flutter-razrabotchika-page7.html#reader" rel="nofollow" class="button">Дальше</a></div> </div> </div> <form method="post" name="dle-comments-form" id="dle-comments-form" ><div id="addcomment" class="addcomment"> <h2>Добавить мнение</h2> <div class="score"> <p class="desc">Ваша оценка</p> <div class="rating-area"> <input type="radio" id="star-10" name="rating" value="10"> <label for="star-10" title="Превосходно"></label> <input type="radio" id="star-9" name="rating" value="9"> <label for="star-9" title="Отлично"></label> <input type="radio" id="star-8" name="rating" value="8"> <label for="star-8" title="Почти отлично"></label> <input type="radio" id="star-7" name="rating" value="7"> <label for="star-7" title="Очень хорошо"></label> <input type="radio" id="star-6" name="rating" value="6"> <label for="star-6" title="Весьма хорошо"></label> <input type="radio" id="star-5" name="rating" value="5"> <label for="star-5" title="Хорошо"></label> <input type="radio" id="star-4" name="rating" value="4"> <label for="star-4" title="Весьма удовлетворительно"></label> <input type="radio" id="star-3" name="rating" value="3"> <label for="star-3" title="Удовлетворительно"></label> <input type="radio" id="star-2" name="rating" value="2"> <label for="star-2" title="Почти удовлетворительно"></label> <input type="radio" id="star-1" name="rating" value="1"> <label for="star-1" title="Неудовлетворительно"></label> </div> </div> <div class="item"><input placeholder="Имя" type="text" name="name" id="name" required></div> <div class="bb-editor"> <textarea name="comments" id="comments" cols="70" rows="10"></textarea> </div> <div class="c-captcha"> <a onclick="reload(); return false;" title="Кликните на изображение чтобы обновить код, если он неразборчив" href="#"><span id="dle-captcha"><img src="/engine/modules/antibot/antibot.php" alt="Кликните на изображение чтобы обновить код, если он неразборчив" width="160" height="80"></span></a> <input placeholder="Введите код" title="Введите код указанный на картинке" type="text" name="sec_code" id="sec_code" required> </div> <button class="button" type="submit" name="submit">Добавить</button> </div> <input type="hidden" name="subaction" value="addcomment"> <input type="hidden" name="post_id" id="post_id" value="448482"><input type="hidden" name="user_hash" value="08092285c0a444fea378aec77e8dddf32e1d8887"></form> <h2 class="mt">Мнения</h2> <div id="dle-ajax-comments"></div> <div class="info"> <div class="text">Еще нет комментариев о книге <strong>Быстрый старт Flutter-разработчика</strong>, и ваше мнение может быть первым и самым ценным! Расскажите о своих впечатлениях, поделитесь мыслями и отзывами. Ваш отзыв поможет другим читателям сделать правильный выбор. Не стесняйтесь делиться своим мнением!</div> </div> <h2 class="mt">Похожие книги</h2> <div class="books"> <div class="short"> <div class="cover"><a href="https://libnotes.org/626195-mql4-programmirovanie-torgovyj-robot-za-odin-vecher.html"><img src="/uploads/posts/images/295/26340268.jpg" alt="Обложка книги MQL4-программирование: торговый робот за один вечер"></a></div> <div class="info"> <div class="name"> <p class="title"><a href="https://libnotes.org/626195-mql4-programmirovanie-torgovyj-robot-za-odin-vecher.html">MQL4-программирование: торговый робот за один вечер</a></p> <p class="author"><a href="/author/evgenij-zhdan/">Евгений Ждан</a></p> </div> <div class="details"> <div class="genres"><a href="https://libnotes.org/znanija-i-navyki/">Знания и навыки</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/">Компьютерная литература</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/knigi-o-kompjuterah/">Книги о компьютерах</a></div> <div class="discussion"> <div class="comments"><a href="https://libnotes.org/626195-mql4-programmirovanie-torgovyj-robot-za-odin-vecher.html#comment">0</a></div> <div class="value">0</div> </div> </div> </div> </div><div class="short"> <div class="cover"><a href="https://libnotes.org/615331-nasha-realnaja-istorija-web3-media-startup-s-nulja-poshagovoe-rukovodstvo-po-sozdaniju-sobstvennogo-agentstva-i-zarabotku-pervogo-milliona-dollarov.html"><img src="/uploads/posts/images/290/69367426.jpg" alt="Обложка книги Наша реальная история: Web3 Media Startup с нуля. Пошаговое руководство по созданию собственного агентства и заработку первого миллиона долларов"></a></div> <div class="info"> <div class="name"> <p class="title"><a href="https://libnotes.org/615331-nasha-realnaja-istorija-web3-media-startup-s-nulja-poshagovoe-rukovodstvo-po-sozdaniju-sobstvennogo-agentstva-i-zarabotku-pervogo-milliona-dollarov.html">Наша реальная история: Web3 Media Startup с нуля. Пошаговое руководство по созданию собственного агентства и заработку первого миллиона долларов</a></p> <p class="author"><a href="/author/vjacheslav-nosko/">Вячеслав Носко</a></p> </div> <div class="details"> <div class="genres"><a href="https://libnotes.org/znanija-i-navyki/">Знания и навыки</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/">Компьютерная литература</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/knigi-o-kompjuterah/">Книги о компьютерах</a></div> <div class="discussion"> <div class="comments"><a href="https://libnotes.org/615331-nasha-realnaja-istorija-web3-media-startup-s-nulja-poshagovoe-rukovodstvo-po-sozdaniju-sobstvennogo-agentstva-i-zarabotku-pervogo-milliona-dollarov.html#comment">0</a></div> <div class="value">0</div> </div> </div> </div> </div><div class="short"> <div class="cover"><a href="https://libnotes.org/482996-kalendar-2023-gorod-nashego-detstva.html"><img src="/uploads/posts/images/224/68906073.jpg" alt="Обложка книги Календарь-2023. Город нашего детства"></a></div> <div class="info"> <div class="name"> <p class="title"><a href="https://libnotes.org/482996-kalendar-2023-gorod-nashego-detstva.html">Календарь-2023. Город нашего детства</a></p> <p class="author"><a href="/author/valerij-zhiglov/">Валерий Жиглов</a></p> </div> <div class="details"> <div class="genres"><a href="https://libnotes.org/znanija-i-navyki/">Знания и навыки</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/">Компьютерная литература</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/knigi-o-kompjuterah/">Книги о компьютерах</a></div> <div class="discussion"> <div class="comments"><a href="https://libnotes.org/482996-kalendar-2023-gorod-nashego-detstva.html#comment">0</a></div> <div class="value">0</div> </div> </div> </div> </div><div class="short"> <div class="cover"><a href="https://libnotes.org/483053-kalendar-2023-hudozhestvennyj-stil-sovremennaja-evrejskaja-zhivopis.html"><img src="/uploads/posts/images/225/68905527.jpg" alt="Обложка книги Календарь-2023. Художественный стиль «Современная еврейская живопись»"></a></div> <div class="info"> <div class="name"> <p class="title"><a href="https://libnotes.org/483053-kalendar-2023-hudozhestvennyj-stil-sovremennaja-evrejskaja-zhivopis.html">Календарь-2023. Художественный стиль «Современная еврейская живопись»</a></p> <p class="author"><a href="/author/valerij-zhiglov/">Валерий Жиглов</a></p> </div> <div class="details"> <div class="genres"><a href="https://libnotes.org/znanija-i-navyki/">Знания и навыки</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/">Компьютерная литература</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/knigi-o-kompjuterah/">Книги о компьютерах</a></div> <div class="discussion"> <div class="comments"><a href="https://libnotes.org/483053-kalendar-2023-hudozhestvennyj-stil-sovremennaja-evrejskaja-zhivopis.html#comment">0</a></div> <div class="value">0</div> </div> </div> </div> </div><div class="short"> <div class="cover"><a href="https://libnotes.org/470667-cifrovoe-modelirovanie-na-c.html"><img src="/uploads/posts/images/218/70622962.jpg" alt="Обложка книги Цифровое моделирование на C#"></a></div> <div class="info"> <div class="name"> <p class="title"><a href="https://libnotes.org/470667-cifrovoe-modelirovanie-na-c.html">Цифровое моделирование на C#</a></p> <p class="author"><a href="/author/dmitrij-pavlov/">Дмитрий Павлов</a></p> </div> <div class="details"> <div class="genres"><a href="https://libnotes.org/znanija-i-navyki/">Знания и навыки</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/">Компьютерная литература</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/knigi-o-kompjuterah/">Книги о компьютерах</a></div> <div class="discussion"> <div class="comments"><a href="https://libnotes.org/470667-cifrovoe-modelirovanie-na-c.html#comment">0</a></div> <div class="value">0</div> </div> </div> </div> </div><div class="short"> <div class="cover"><a href="https://libnotes.org/462404-kak-sdelat-video-s-muzykoj-na-telefone.html"><img src="/uploads/posts/images/214/63988387.jpg" alt="Обложка книги Как сделать видео с музыкой на телефоне"></a></div> <div class="info"> <div class="name"> <p class="title"><a href="https://libnotes.org/462404-kak-sdelat-video-s-muzykoj-na-telefone.html">Как сделать видео с музыкой на телефоне</a></p> <p class="author"><a href="/author/aleksandra-belovickaja/">Александра Беловицкая</a></p> </div> <div class="details"> <div class="genres"><a href="https://libnotes.org/znanija-i-navyki/">Знания и навыки</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/">Компьютерная литература</a>, <a href="https://libnotes.org/znanija-i-navyki/kompjuternaja-literatura/knigi-o-kompjuterah/">Книги о компьютерах</a></div> <div class="discussion"> <div class="comments"><a href="https://libnotes.org/462404-kak-sdelat-video-s-muzykoj-na-telefone.html#comment">0</a></div> <div class="value">0</div> </div> </div> </div> </div> </div> <script type="application/ld+json"> [ { "@context": "https://schema.org", "@type": "Book", "name": "Быстрый старт Flutter-разработчика", "author": { "@type": "Person", "name": "Андрей Алеев", "url": "https://libnotes.org/author/andrej-aleev/" }, "genre": ["Знания и навыки", "Компьютерная литература", "Книги о компьютерах"], "inLanguage": "ru", "datePublished": "2019-12-16", "image": "https://libnotes.org/uploads/posts/images/207/48781701.jpg", "description": "В этой книге даны необходимые элементы, база, которую нужно знать Flutter-разработчику, чтобы писать кросс-платформенные мобильные приложения под Android и iOS на языке Dart. Все это представлено в наглядной форме, на практических примерах, в формате уроков. После их освоения вы сможете именовать себя Flutter-разработчиком. Flutter and the related logo are trademarks of Google LLC. We are not endorsed by or affiliated with Google LLC....", "url": "https://libnotes.org/448482-bystryj-start-flutter-razrabotchika.html", "potentialAction": { "@type": "ReadAction", "target": "https://libnotes.org/448482-bystryj-start-flutter-razrabotchika.html" } }, { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "item": {"@id": "https://libnotes.org/", "name": "Главная"} }, { "@type": "ListItem", "position": 2, "item": {"@id": "https://libnotes.org/znanija-i-navyki/", "name": "Знания и навыки"} }, { "@type": "ListItem", "position": 3, "item": {"@id": "https://libnotes.org/448482-bystryj-start-flutter-razrabotchika.html", "name": "Быстрый старт Flutter-разработчика (сразу полная версия бесплатно доступна) Андрей Алеев читать онлайн полностью / Библиотека"} } ] } ] </script> </main> </div> <footer> <div class="wrap"> <div class="text"> <p>Большинство книг на сайте опубликовано легально на правах партнёрской программы ЛитРес. Если Ваша книга была опубликована с нарушениями авторских прав, пожалуйста, направьте Вашу жалобу на <a href="mailto:info@libnotes.org" rel="nofollow">info@libnotes.org</a> или заполните <a href="/index.php?do=feedback" rel="nofollow">форму обратной связи</a>.</p> </div> </div> </footer> <!-- HTML всплывающего окна --> <div id="popup-overlay" class="popup-overlay"> <div class="popup-container"> <span class="popup-close">×</span> <div class="popup-content"> <div class="popup-icon">📚</div> <h3 class="popup-title">Книжные новинки</h3> <p class="popup-text">На какой email вам отправлять новинки книг для чтения?</p> <form id="email-form" class="email-form"> <input type="email" id="user-email" name="email" placeholder="your@email.com" required> <button type="submit" class="submit-btn">Подписаться</button> </form> <div class="privacy-note"> 🔒 Мы не передаем ваши данные третьим лицам </div> </div> </div> </div> <style> /* Стили всплывающего окна */ .popup-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); z-index: 99999; justify-content: center; align-items: center; } .popup-overlay.active { display: flex; animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .popup-container { background: white; border-radius: 15px; padding: 30px; max-width: 450px; width: 90%; position: relative; box-shadow: 0 10px 30px rgba(0,0,0,0.3); animation: slideIn 0.3s ease; } @keyframes slideIn { from { transform: translateY(-50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .popup-close { position: absolute; top: 15px; right: 20px; font-size: 28px; color: #999; cursor: pointer; transition: color 0.3s; line-height: 1; } .popup-close:hover { color: #333; } .popup-icon { font-size: 48px; text-align: center; margin-bottom: 15px; } .popup-title { font-size: 24px; color: #2c3e50; text-align: center; margin-bottom: 15px; font-weight: 600; } .popup-text { font-size: 16px; color: #555; text-align: center; margin-bottom: 25px; line-height: 1.5; } .email-form { display: flex; flex-direction: column; gap: 12px; } #user-email { padding: 14px; border: 2px solid #e0e0e0; border-radius: 8px; font-size: 16px; outline: none; transition: border-color 0.3s; } #user-email:focus { border-color: #3498db; } .submit-btn { padding: 14px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; transition: transform 0.2s, box-shadow 0.2s; } .submit-btn:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4); } .submit-btn:active { transform: translateY(0); } .privacy-note { text-align: center; margin-top: 15px; font-size: 12px; color: #999; } /* Сообщения */ .message { padding: 10px; border-radius: 5px; margin-top: 10px; text-align: center; display: none; } .message.success { background: #d4edda; color: #155724; display: block; } .message.error { background: #f8d7da; color: #721c24; display: block; } /* Адаптивность */ @media (max-width: 480px) { .popup-container { padding: 20px; } .popup-title { font-size: 20px; } .popup-text { font-size: 14px; } } </style> <script> $(document).ready(function() { // Получаем DLE хеш пользователя (если доступен в глобальной области) const dleUserHash = window.dle_login_hash || ''; // Проверяем, подписан ли уже пользователь const isSubscribed = localStorage.getItem('book_subscribed'); if (isSubscribed === 'true') { return; // Не показываем попап } // Управление показами let popupTimer; const SHOW_DELAY = 7 * 60 * 1000; // 7 минут до первого показа const CLOSE_COOLDOWN = 7 * 60 * 1000; // 7 минут до повторного показа const DAILY_COOLDOWN = 24 * 60 * 60 * 1000; // 24 часа // Получаем историю закрытий let closeHistory = JSON.parse(localStorage.getItem('popup_close_history') || '[]'); function showPopup() { if (localStorage.getItem('book_subscribed') === 'true') return; // Очищаем старые записи (старше 24 часов) const now = Date.now(); closeHistory = closeHistory.filter(timestamp => now - timestamp < DAILY_COOLDOWN); // Проверяем, не превышен ли лимит закрытий if (closeHistory.length >= 2) { scheduleNextShow(DAILY_COOLDOWN); return; } $('#popup-overlay').addClass('active'); } function hidePopup() { $('#popup-overlay').removeClass('active'); $('#email-form .message').remove(); } function scheduleNextShow(delay) { clearTimeout(popupTimer); popupTimer = setTimeout(showPopup, delay); } // Показываем попап через 7 минут после загрузки страницы popupTimer = setTimeout(showPopup, SHOW_DELAY); // Закрытие по клику на крестик $(document).on('click', '.popup-close', function() { hidePopup(); // Записываем время закрытия closeHistory.push(Date.now()); localStorage.setItem('popup_close_history', JSON.stringify(closeHistory)); // Планируем следующий показ if (closeHistory.length < 2) { scheduleNextShow(CLOSE_COOLDOWN); } else { scheduleNextShow(DAILY_COOLDOWN); } }); // Закрытие по клику вне окна $(document).on('click', '#popup-overlay', function(e) { if (e.target === this) { hidePopup(); closeHistory.push(Date.now()); localStorage.setItem('popup_close_history', JSON.stringify(closeHistory)); if (closeHistory.length < 2) { scheduleNextShow(CLOSE_COOLDOWN); } else { scheduleNextShow(DAILY_COOLDOWN); } } }); // Отправка email $(document).on('submit', '#email-form', function(e) { e.preventDefault(); const email = $('#user-email').val().trim(); // Валидация на клиенте if (!isValidEmail(email)) { showMessage('Пожалуйста, введите корректный email', 'error'); return; } // Отправляем через AJAX $.ajax({ url: '/engine/ajax/save_email.php', method: 'POST', data: { email: email, dle_user_hash: dleUserHash }, dataType: 'json', beforeSend: function() { $('.submit-btn').prop('disabled', true).text('Отправка...'); }, success: function(response) { if (response.status === 'success') { showMessage('✓ ' + response.message, 'success'); localStorage.setItem('book_subscribed', 'true'); // Скрываем попап через 2 секунды setTimeout(function() { hidePopup(); }, 2000); } else { showMessage(response.message, 'error'); $('.submit-btn').prop('disabled', false).text('Подписаться'); } }, error: function() { showMessage('Произошла ошибка. Попробуйте позже.', 'error'); $('.submit-btn').prop('disabled', false).text('Подписаться'); } }); }); function showMessage(text, type) { $('#email-form .message').remove(); $('<div>') .addClass('message ' + type) .text(text) .appendTo('#email-form'); } function isValidEmail(email) { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(email); } }); </script> <div id="adfox_174501110656364052"></div> <script> window.yaContextCb.push(()=>{ Ya.adfoxCode.create({ ownerId: 1451303, containerId: 'adfox_174501110656364052', params: { p1: 'cxbbb', p2: 'iazu', pfc: 'hezce', pfb: 'bgoymj' } }) }) </script> </body> </html> <!-- -->