基礎
フォーム投稿(PHP + フロントバリデーション)
contact.php(抜粋)
<?php
// contact.php — フォーム受信
$errors = [];
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($name === '') $errors['name'] = 'お名前は必須です。';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors['email'] = 'メール形式が不正です。';
if ($message === '') $errors['message'] = 'メッセージを入力してください。';
if (!$errors) {
// TODO: 保存やメール送信など
http_response_code(200);
echo json_encode(['ok' => true]);
exit;
}
http_response_code(422);
echo json_encode(['ok' => false, 'errors' => $errors]);
exit;
}
?>
フロント(HTML/JS)サンプル
フォーム + JS
<form id="contactForm" novalidate>
<label>お名前<input name="name" required></label>
<label>メール<input name="email" type="email" required></label>
<label>内容<textarea name="message" required></textarea></label>
<button>送信</button>
</form>
<script>
const f = document.querySelector('#contactForm');
f.addEventListener('submit', async (e)=>{
e.preventDefault();
const fd = new FormData(f);
const res = await fetch('contact.php', { method:'POST', body:fd });
const data = await res.json();
if(data.ok){ alert('送信しました'); f.reset(); }
else{ alert('エラー: '+ JSON.stringify(data.errors)); }
});
</script>
JSON を fetch して描画
news.json を読み込み
<ul id="news"></ul>
<script>
(async ()=>{
try{
const res = await fetch('/data/news.json');
const items = await res.json();
const ul = document.getElementById('news');
items.slice(0,5).forEach(it=>{
const li = document.createElement('li');
li.innerHTML = `<time datetime="${it.date}">${it.date}</time> `+
`<a href="${it.url}">${it.title}</a>`;
ul.appendChild(li);
});
}catch(e){ console.error(e); }
})();
</script>
例
例1: アコーディオン(詳細)
クリックで開閉(WAI-ARIA 不要のネイティブ要素)
ネイティブの <details> はアクセシブルで制御も容易です。
コピー対象
<details>
<summary>クリックで開閉(WAI-ARIA 不要のネイティブ要素)</summary>
<p>ネイティブの <code><details></code> はアクセシブルで制御も容易です。</p>
</details>
例2: クリップボードへコピー
コピー対象
console.log('Hello Web Dev');
例3: シンプルなルーティング(PHP)
router.php(超簡易)
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
switch($path){
case '/': require 'pages/home.php'; break;
case '/contact': require 'pages/contact.php'; break;
default: http_response_code(404); echo 'Not Found';
}
?>