/
sungreen
/
OrthodoxJobs
Обзор
Документация
Войти
/
sungreen
/
OrthodoxJobs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
form.html
392 строки
13 KB
Николай
update form.html
14 янв 2026, 18:28
14 янв 2026, 18:28
66b3823
Код
Авторство
О чём код?
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Telegram Web App Form</title> <script src="https://telegram.org/js/telegram-web-app.js"></script> <style> * { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; align-items: center; justify-content: center; } .container { width: 100%; max-width: 400px; background: white; border-radius: 20px; padding: 30px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); animation: slideIn 0.5s ease; } @keyframes slideIn { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .header { text-align: center; margin-bottom: 30px; } .header h1 { color: #333; font-size: 24px; font-weight: 600; margin-bottom: 10px; } .header p { color: #666; font-size: 14px; line-height: 1.4; } .form-group { margin-bottom: 20px; } label { display: block; margin-bottom: 8px; color: #555; font-weight: 500; font-size: 14px; } input, textarea { width: 100%; padding: 12px 16px; border: 2px solid #e0e0e0; border-radius: 12px; font-size: 16px; transition: all 0.3s ease; background: #f8f9fa; } input:focus, textarea:focus { outline: none; border-color: #667eea; background: white; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); } textarea { min-height: 120px; resize: vertical; font-family: inherit; } .primary-btn { width: 100%; padding: 16px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 12px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; margin-bottom: 15px; display: flex; align-items: center; justify-content: center; gap: 10px; } .primary-btn:hover { transform: translateY(-2px); box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3); } .primary-btn:active { transform: translateY(0); } .secondary-btn { width: 100%; padding: 16px; background: #f8f9fa; color: #555; border: 2px solid #e0e0e0; border-radius: 12px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; justify-content: center; gap: 10px; } .secondary-btn:hover { background: #e9ecef; border-color: #667eea; } .icon { font-size: 20px; } .status { margin-top: 20px; padding: 15px; border-radius: 12px; text-align: center; font-size: 14px; display: none; } .success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .info { background: #d1ecf1; color: #0c5460; border: 1px solid #bee5eb; } .footer { margin-top: 30px; text-align: center; color: rgba(255,255,255,0.8); font-size: 12px; line-height: 1.4; } .footer a { color: white; text-decoration: underline; } .loading { animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @media (max-width: 480px) { .container { padding: 20px; border-radius: 16px; } body { padding: 15px; } } </style> </head> <body> <div class="container"> <div class="header"> <h1>📝 Форма отправки</h1> <p>Заполните форму и отправьте данные в Telegram бот</p> </div> <div class="form-group"> <label for="name">Имя:</label> <input type="text" id="name" placeholder="Введите ваше имя"> </div> <div class="form-group"> <label for="message">Сообщение:</label> <textarea id="message" placeholder="Введите ваше сообщение..."></textarea> </div> <button class="primary-btn" id="sendBtn"> <span class="icon">📤</span> <span>Отправить через Telegram</span> </button> <button class="secondary-btn" id="copyBtn"> <span class="icon">📋</span> <span>Скопировать в буфер</span> </button> <div class="status info" id="infoStatus"> Используйте кнопку в Telegram для отправки данных </div> <div class="status success" id="successStatus"> ✅ Данные успешно отправлены! </div> <div class="status error" id="errorStatus"> ❌ Ошибка при отправке </div> </div> <div class="footer"> <p>Работает через Telegram Web Apps<br> Используйте официальные клиенты Telegram</p> </div> <script> // Инициализация Telegram Web App let tg = window.Telegram.WebApp; // Функция для показа статуса function showStatus(type, message = '') { const statuses = ['infoStatus', 'successStatus', 'errorStatus']; statuses.forEach(id => { const el = document.getElementById(id); el.style.display = 'none'; if (message && el.id === type + 'Status') { el.textContent = message; } }); const activeStatus = document.getElementById(type + 'Status'); if (activeStatus) { activeStatus.style.display = 'block'; setTimeout(() => { if (type !== 'info') { activeStatus.style.display = 'none'; } }, 5000); } } // Функция для копирования в буфер обмена function copyToClipboard(text) { navigator.clipboard.writeText(text).then(() => { showStatus('success', '✅ Скопировано в буфер обмена!'); }).catch(err => { console.error('Ошибка копирования:', err); showStatus('error', '❌ Ошибка при копировании'); }); } // Функция для получения данных формы function getFormData() { const name = document.getElementById('name').value.trim() || 'Не указано'; const message = document.getElementById('message').value.trim() || 'Сообщение отсутствует'; return JSON.stringify({ name: name, message: message, timestamp: new Date().toISOString(), platform: navigator.platform, userAgent: navigator.userAgent.substring(0, 100) }, null, 2); } // Функция отправки данных через Telegram function sendViaTelegram() { const data = getFormData(); try { // Проверяем, что tg.sendData доступен (работает только при запуске через кнопку) if (typeof tg.sendData === 'function') { tg.sendData(data); showStatus('success', '✅ Отправлено через Telegram!'); // Закрываем Web App после отправки (опционально) setTimeout(() => { tg.close(); }, 2000); } else { throw new Error('Метод sendData недоступен'); } } catch (error) { console.error('Ошибка отправки через Telegram:', error); showStatus('error', '❌ Отправка через Telegram недоступна. Используйте кнопку в Telegram.'); // Предлагаем скопировать данные if (confirm('Не удалось отправить через Telegram. Скопировать данные в буфер обмена?')) { copyToClipboard(data); } } } // Инициализация при загрузке document.addEventListener('DOMContentLoaded', function() { // Показываем информацию о статусе Web App if (tg.initDataUnsafe.user) { showStatus('info', `👤 Привет, ${tg.initDataUnsafe.user.first_name || 'пользователь'}!`); } // Обработчик для кнопки отправки через Telegram document.getElementById('sendBtn').addEventListener('click', function() { const btn = this; const originalText = btn.innerHTML; // Показываем индикатор загрузки btn.innerHTML = '<span class="icon loading">⟳</span><span>Отправка...</span>'; btn.disabled = true; // Имитируем задержку для UX setTimeout(() => { sendViaTelegram(); // Восстанавливаем кнопку через 3 секунды setTimeout(() => { btn.innerHTML = originalText; btn.disabled = false; }, 3000); }, 500); }); // Обработчик для кнопки копирования document.getElementById('copyBtn').addEventListener('click', function() { const data = getFormData(); copyToClipboard(data); }); // Автоматически фокусируемся на первом поле document.getElementById('name').focus(); }); // Используем tg.ready() для Desktop клиентов tg.ready(); // Расширяем окно Web App для корректного отображения tg.expand(); // Логируем информацию о Web App для отладки console.log('Telegram Web App initialized:', { platform: tg.platform, version: tg.version, viewportHeight: tg.viewportHeight, initData: tg.initData, initDataUnsafe: tg.initDataUnsafe }); </script> </body> </html>