jackytom
@jackytom

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

javascriptが効かない

Q&A

Closed

PHPのソースからjavascriptを呼び出して入力チェックのようなことをしているのですが、1つのjavascriptが全く効きません。

を確認しましたが、ブラウザはjavascript有効になっています。
デバッグツールも確認しましたが、エラーは出てません。
当然ですが、console.logの結果も出てきません。

他のjavascriptは問題なく動きます。

該当のソースだけ動かない原因がつかめませんでした。

原因究明にご協力いただければ幸いです。

該当ソースを添付します。

javascript

<?php ?>
<script>

	document.addEventListener('DOMContentLoaded', function() {
			document.getElementById('cansel').addEventListener('click', function(){
				let today = JSON.parse('<?php echo $today; ?>');
				let reserveDate = JSON.parse('<?php echo $reserveDate; ?>');
				let date1 = new Date(reserveDate);
				let date2 = new Date(today);

				//メッセージ
				let	dateMsg = document.getElementById('date_msg');
				//メッセージ親
				let msg = document.getElementById('msg')

				console.log(date1);
				console.log(date2);

				let day = (date1 - date2) / 86400000;

				console.log(day);
				
				if(day < 2 && dateMsg === null) {
					let msg = '予約日前日以降のキャンセルはできません';
					let ptag = document.createElement('p');
					ptag.id = 'date_msg';
					let text = document.createTextNode(msg);
					ptag.appendChild(text);
						msg.appendChild(ptag);
						event.preventDefault();
						}
						else{}

				if(day < 2 && dateMsg !== null) {
					document.getElementById('date_msg').remove();
					let msg = '予約日前日以降のキャンセルはできません';
					let ptag = document.createElement('p');
					ptag.id = 'date_msg';
					let text = document.createTextNode(msg);
					ptag.appendChild(text);
						msg.appendChild(ptag);
						event.preventDefault();
						}
						else{}
				
				if(day >= 2 && dateMsg !== null) {
					document.getElementById('date_msg').remove();
					}				

			},false)
		},false)
</script>
<noscript>
	JavaScriptを実行できません
</noscript>;

(参考)呼び出し元のPHP

<?php
	session_start();
	header('Expires:-1');
	header('Cache-Control:');
	header('Pragma:');
	function generateToken(){
		$bytes = openssl_random_pseudo_bytes(16);
		return bin2hex($bytes);
	}
	$token = generateToken();
	$_SESSION['token'] = $token;
	function escape($val)
		{
		return htmlspecialchars($val, ENT_QUOTES | ENT_HTML5, 'UTF-8');
		}
	require_once("db_connect.php");
	require_once('password_db.php');
	$date = date("Y/m/d");
	$today = json_encode($date);
?>
<!doctype html>
<html lang=ja>
	<head>
		<meta charset="utf-8">
		<title>予約確認</title>
		<meta name="description" content="マイページ">
		<!--リセットcss-->
		<link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
		<!--css-->
		<link rel="stylesheet" href="css/mypage.css">
		<!--レスポンシブ対応-->
		<meta name="viwport" content="width=device-width, initial-scale=1">
		<!--Googleフォント-->
		<link href="https://fonts.googleapis.com/css2?family=Sawarabi+Gothic&display=swap" rel="stylesheet">
		<link href="https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@500&display=swap" rel="stylesheet">
	</head>
	<body>
		<?php require_once('header.php')?>
		<h1>予約確認</h1>
		<!--<div class="hd">-->
		<form action="mypage_reserve_cansel.php" method="post" class = "reserve_form">
			<table class="tablehead">
				<tr>
					<th class="header">予約日</th>
					<th class="header">時間帯</th>
					<th class="header">サービス</th>
					<th class="header">オプション</th>
					<th class="header">料金</th>
					<th class="header2"></th>
				</tr>
			<!--</table>-->
		 	<?php
				$sql = "select
								r.reserve_id,
								r.reserve_date,
								t.time_zone_text,
								s.service_name,
								o.option_name,
								r.customer_id,
								r.time_zone_id,
								r.service_id,
								r.option_id,
								r.total_amount
							from
								reservation r,
								time_zone t,
								service s,
								option o
							where
								r.time_zone_id = t.time_zone_id
								and
								r.service_id = s.service_id
								and
								r.option_id = o.option_id
								and
								r.reserve_date >= :current_date";

				$stmt = $pdo->prepare($sql);
				$stmt -> bindValue(':current_date', date('Y-m-d'));
				$stmt -> execute();
				$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
		 		foreach($row as $data): 
		 	?>
		 		<!--<table class="reserve_table">-->
					<tr>
						<input type="hidden" name="token" class="token" id="token" value="<?=$token?>">
						<input type="hidden" name="reserve_id" class="reserve_id" id="reserve_id" value="<?=$data['reserve_id']?>">
						<input type="hidden" name="time_zone_id" class="time_zone_id" id="time_zone_id" value="<?=$data['time_zone_id']?>">
						<input type="hidden" name="service_id" class="service_id" id="service_id" value="<?=$data['service_id']?>">
						<input type="hidden" name="option_id" class="option_id" id="option_id" value="<?=$data['option_id']?>">
						<td class="dt">
							<input type="text" name="reserve_date" value="<?=escape($data['reserve_date'])?>" id="reserve_date" readonly="readonly">
						</td>
						<td class="dt">
							<input type="text" name="time_zone_text" value="<?= escape($data['time_zone_text'])?>" id="time_zone_text" readonly="readonly">
						</td>
						<td class="dt">
							<input type="text" name="service_name" value="<?= escape($data['service_name']) ?>" id="service_name">
						</td>
						<td class="dt">
							<input type="text" name="option_name" value="<?= escape($data['option_name'])?>" id="option_name">
						</td>
						<td class="dt">
							<input type="text" name="total_amount" value="<?= escape($data['total_amount'])?>" id="total_amount">
						</td>
						<td class="bt">
							<button type="submit" name="cansel" class="cansel" id="cansel">キャンセル</button>
						</td>
					</tr>
					<?php endforeach; ?>
				</table>
				<div id="msg">
				<div>
				<div class="bt_re">
					<button type="button" class="return" name="return" id="return" onclick="history.back()">戻る</button>
				</div>
			</form>
			<?php
				$rDate = date('Y/m/d', strtotime(escape($data['reserve_date'])));
				$reserveDate = json_encode($rDate);
			?>
			<?php require_once('js/mypage_cansel_check_js.php')?>
			<?php require_once('footer.php')?>
	</body>
</html>
0

2Answer

そもそも当該スクリプト用ファイル mypage_cansel_check_js.php (であってますよね?) の埋め込み~実行自体が成功しているかの確認として
こんな感じで console.log 出力を増やしたら問題の切り分けがしやすいと思います。

mypage_cansel_check_js.php
<?php ?>
<script>

-	document.addEventListener('DOMContentLoaded', function() {
-			document.getElementById('cansel').addEventListener('click', function(){
+	console.log("hoge 1"); // スクリプトが正常に読み込まれている
+	document.addEventListener('DOMContentLoaded', function() {
+			console.log("hoge 2"); // DOMContentLoaded で正常に発火している
+			let btn = document.getElementById('cansel');
+			console.log("hoge 3", btn); // id=cansel が見つかった
+			btn.addEventListener('click', function(){
+				console.log("hoge 4"); // ボタンクリックで正常に発火している
				let today = JSON.parse('<?php echo $today; ?>');
				let reserveDate = JSON.parse('<?php echo $reserveDate; ?>');
				let date1 = new Date(reserveDate);
				let date2 = new Date(today);
1Like

Comments

  1. @jackytom

    Questioner

    回答ありがとうございます。
    丁寧にソースのサンプルまで書いていただき、大変助かりました。
    ソースのミスでcanselが見つからなかったようです。
    本件、クローズさせていただきます。

ブラウザの開発ツールを見てエラーが出てないか調べましたか? まだならそれをやってください。

0Like

Your answer might help someone💌