@jackytom

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

javascriptでresetしようとするとUncaught ReferenceError

Q&A

Closed

画面上部で検索条件を設定して、画面下部で一覧表示する画面を作っています。
クリアをクリックしたら、検索条件を全てクリアするべくjavascriptを記述してみましたが、
Uncaught ReferenceError: del is not defined at HTMLButtonElement.onclick
とエラーが出ます。

調査したところ、原因はタイプミスか、html側のbuttonタグ内でID名等と同じfunction名称を利用すると、このエラーになることがあるとの事で、後者に該当したので修正しましたが、同様にエラーになりました。

エラー原因の究明にご協力いただければ幸いです。
ソースコードを添付します。

<追記>
javascript内にoptionを初期化するための記述がありますが、こちらは問題なく動いてます。

<?php
try{
	require_once("db_connect.php");
	$pdo = new PDO("mysql:host=$SERV;dbname=$DB;charset=$CHAR",$USER,$PASS);
}
catch(PDOException $e){echo "次がエラーの内容です。;" .$e->getMessage();
}

$sdate = $_POST['sdate'] ?? "";
$edate = $_POST['edate'] ?? "";
$title = $_POST['title'] ?? "";
$content = $_POST['content'] ?? "";
$status = $_POST['status'] ?? "";
$clear = $_POST['clear'] ?? "";

?>
<!doctype html>
<html lang=ja>
	<head>
		<meta charset="utf-8">
		<title>News一覧</title>
		<meta name="description" content="Salon Yuri-rinの管理者ページ">
		<!--リセットcss-->
		<link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
		<!--css-->
		<link rel="stylesheet" href="css/news_style.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>
		<h1>News一覧</h1>
		<table class="search_table">
		<form class="conditions" id="conditions" action="news_table.php" method="post">
			<tr id="date" class="date">
				<td><label for="sdate">日付</label></td>
				<td><input type="date" name="sdate" id="sdate" value="<?=$sdate?>"></td>
				<td><label for="edate"></label></td>
				<td><input type="date" name="edate" id="edate" value="<?=$edate?>"></td>
			</tr>
			<tr>
				<td><label for="title">タイトル</label></td>
				<td><input type="text" name="title" id="title" value="<?=$title?>"></td>
				<td><label for="content">内容</label></td>
				<td><input type="text" name="content" id="content" value="<?=$content?>"></td>
			</tr>
			<tr>	
				<td><label for="status">ステータス</label></td>
				<td>
					<select name="status" id="status">
						<option value="0" 
							<?php if($status === '0')
								{echo 'selected';}
									else if($status === '1')
									{echo '';}
										else {echo '';} 
								?>
						>未選択</option>
						<option value="1"  
							<?php if($status === '1')
								{echo 'selected';}
									else if($status === '0')
										{echo '';}
										else {echo '';}
								?>
							>未公開</option>
						<option value="2"  
							<?php if($status === '2')
								{echo 'selected';}
									else if($status === '0')
										{echo '';}
										else {echo '';}
								?>
							>公開</option>
					</select>			
				</td>
		</form>
		</table>
		<button type="button" form="conditions" class="search_button" id="clear" name="clear" onclick="del()">クリア</button>
		<button type="submit" form="conditions" name="search_button" class="search_button" id='search_button'>検索</button>
		<table class="tablehead">
			<tr>
				<th class="header">日付</th>
				<th class="header">タイトル</th>
				<th class="header">内容</th>
				<th class="header">公開ステータス</th>
				<th class="header2">
					<form class="create" action="news_create.php">
						<button type="submit" name="button" value="登録" class="button_a">登録</button>
					</form>
				</th>
				<th class="header2"></th>
			</tr>
		</table>
		<?php
			//if(isset($_POST['sdate']) && isset($_POST['edate']) && isset($_POST['title']) && isset($_POST['content']) && isset($_POST['status']) && isset($row) &&
				if(isset($_POST['search_button'])){
			$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
			$sql =
				('select * from news
					where 
					(pub_date >= ? and pub_date <= ?)
					and title like ?
					and content like ?
					and status = ?'
					);
			$stmt = $pdo->prepare($sql);
			$stmt ->execute(
				[htmlspecialchars(date_format(date_create($_POST['sdate']),'Y-m-d'), ENT_QUOTES | ENT_HTML5, 'UTF-8'),
				htmlspecialchars(date_format(date_create($_POST['edate']),'Y-m-d'), ENT_QUOTES | ENT_HTML5, 'UTF-8'),
				htmlspecialchars($_POST['title'], ENT_QUOTES | ENT_HTML5, 'UTF-8'),
				htmlspecialchars($_POST['content'], ENT_QUOTES | ENT_HTML5, 'UTF-8'),
				htmlspecialchars($_POST['status'], ENT_QUOTES | ENT_HTML5, 'UTF-8'),]);
			$stmt->bindvalue(":title", "%" . $_POST['title'] . "%", PDO::PARAM_STR);
			$stmt->bindvalue(":content", "%" . $_POST['content'] . "%", PDO::PARAM_STR);
			$row = $stmt->fetchAll(PDO::FETCH_ASSOC);}?>

		 	<?php foreach($row as $data):?>
			<form action="?" method="post" class = "newstblform">
			 	<div class = "table1">
			 		<table class="newstable">
			 			<tr>
			 				<label>
								<input type="hidden" name="seq" value="<?=htmlspecialchars($data['id'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="seq">
							</label>
						<td class="dt">
							<label>
								<input type="text" name="pub_date" value="<?=htmlspecialchars($data['pub_date'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="sei" readonly="readonly">
							</label>
						</td>
						<td class="dt">
							<label>
								<input type="text" name="title" value="<?=htmlspecialchars($data['title'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id=mei readonly="readonly">
							</label>
						</td>
						<td class="dt">
							<label>
								<input type="text" name="content" value="<?=htmlspecialchars($data['content'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="sei_kana">
							</label>
						</td>
						<td class="dt">
							<label>
								<input type="text" name="status" value="<?=htmlspecialchars($data['status'], ENT_QUOTES | ENT_HTML5, 'UTF-8')?>" id="sei_kana">
							</label>
						</td>
						<td class="bt">
							<input type="submit" name=button value="修正" formaction="news_update.php" class="button_a">
						</td>
						<td class="bt">
							<input type="submit" name=button value="削除" formaction="news_delete_conf.php" class="button_a">
						</td>
						</tr>
					</table>
				</div>
			</form>
			<?php endforeach; ?>
		<?php //require_once('newslist_chk_js.php'); ?>
		<script>
			document.addEventListener('DOMContentLoaded', function() {
				 document.getElementById('clear').addEventListener('click', function(){
					var select = document.getElementById('status'); 
					select.selectedIndex = 0;
					function del() {
						document.conditions.reset();
					}
				}),false;
			}),false;
		</script>
		<noscript>
			javascriptが実行できません
		</noscript>
	</body>
</html>
0 likes

2Answer

Comments

  1. この一言で自分で正解を導き出せるならたぶんここで質問してないと思います.
    他人も参照する可能性のある場ですので,もう少し脈絡を見い出せる回答をしてほしいと感じます.

  2. @jackytom

    Questioner

    確認不足で申し訳ありません。
    81行目の
    button type="button" form="conditions" class="search_button" id="clear" name="clear" onclick="del()">クリア
    でエラーになっているようです。

  3. @Verclene 他人の回答に横レス・因縁をつけるのは止めましょう。

  4. @jackytom

    Questioner

    ご指摘いただいた記事は同内容ではありません。
    同じ画面で複数の問題が発生し、負荷分散の意味で別々に書かせていただきました。
    同内容だったらマルチポストだということは知ってましたが、これもマルチポストと
    呼ぶのでしょうか。

  5. 同じ「クリア」ボタンの処理に関するマルチポストです。

    負荷分散の意味で別々に書かせていただきました。

    誰の負荷を分散しているつもりですか? そもそもそんな言い訳は通じませんよ。ここと stackoverflow の両方のあなたの質問を見て考えてくれた閲覧者・回答者の負荷は倍になってることが理解できませんか。

    マルチポストでないと言うなら、少なくとも、まず私の回答で解決した stackoverflow の方をきちんとクローズすること、そしてこちらで質問する際に stackoverflow の URL を書いてその続きであることを述べるぐらいのことはしましょう。

  6. @jackytom

    Questioner

    理解しました。
    同じ方に対応いただいていることに気づかず、申し訳ありません。
    以後注意いたします。
    ご指摘いただいたスレッドはクローズしました。

  7. 質問者さんの言う「クリア」というのが、select 要素と input type="text" 要素を初期画面の設定に戻すということで良ければ <input type="reset"> を使ってはいかがですか?

    <input type="reset">
    https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/reset

    以下のような感じ。

    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
    </head>
    <body>
        <form id="form1">
            <select name="status" id="status">
                <option value="0">未選択</option>
                <option value="1" selected="selected">未公開</option>
                <option value="2">公開</option>
            </select>
    
            <input type="text" value="初期値" />
            <input type="text" />
            
            <input type="reset" value="クリア"/>
        </form>
    </body>
    </html>
    

    初期画面の設定に戻すという点に注意してください。上の例で [クリア] ボタンをクリックすると、select は「未公開」が選択された状態に、input type="text" は前者が "初期値" に後者は空白に戻ります。

  8. @jackytom

    Questioner

    わざわざありがとうございます。
    解決したと報告しましたが、訂正させてください。
    ページリロードして、「検索」をクリックする前までは、確かに値のリセットが
    できてましたが、条件値を入力して「検索」をクリックすると、
    リセットできませんでした。
    自分なりに原因調査しましたが、おそらく、valueに$_POSTを設定している(submit
    しても消えないようにするため)ため、検索後は初期値となり、リセットできなかった
    ものと思われます。
    教えていただいた方法も、記載いただいた通り、「初期値に戻す」ことが目的のため(?)
    空白にはできませんでした。
    前よりも少しシンプルに下記に変更して解決しました。
    念のため、ソースコードは下記です。

    <script>
    document.getElementById('clear').addEventListener('click', function(){
    						let status = document.getElementById('status');
    						let sdate = document.getElementById('sdate');
    						let edate = document.getElementById('edate');
    						let title = document.getElementById('title');
    						let content = document.getElementById('title');
    						document.getElementById('sdate').value = "";
    						document.getElementById('edate').value = "";
    						document.getElementById('title').value = "";
    						document.getElementById('content').value = "";
    						status.selectedIndex = 0;
    					},false)
    </script>
    
  9. 上のコードの中の、

    let sdate = document.getElementById('sdate');
    let edate = document.getElementById('edate');
    let title = document.getElementById('title');
    let content = document.getElementById('title');
    

    は不要です。考えてみましょう。

  10. @jackytom

    Questioner

    あ、そうですね。

    document.getElementById('sdate').value = "";
    document.getElementById('edate').value = "";
    document.getElementById('title').value = "";
    document.getElementById('content').value = "";
    

    と記述してるから変数の宣言は不要ということですよね?

とりあえず目についたところだけ指摘します.

document.getElementById('clear').addEventListener('click', function(){
  var select = document.getElementById('status'); 
  select.selectedIndex = 0;
  function del() { //1.
    document.conditions.reset();  //2.
  }
}),false; //3.
  1. このコールバック内にあるdel関数はスコープがこの中に限定されるため,onclickのような場所から参照することはできません.
    なにか勘違いをしていらっしゃるかもしれませんが,addEventListenerを呼びだした時点でイベント処理は登録されるため,onclick別途わざわざ指定する必要はありませんし,内部に関数を作る必要もありません.
  2. この方式でformを参照したい場合はformタグのname属性を指定してやる必要があります.
  3. 第3引数のつもりでfalseを書いていると推察しますが(~)の外に出ています.ちなみにaddEventListenerの第3引数は既定でfalseのため指定不要です.

0Like

Comments

  1. ついでに1か所全角スペースと思しき箇所がありますので指摘しておきます.赤点線の部分です.

    <button type="submit" form="conditions" name="search_button" class="search_button" id='search_button'>検索</button>
    
  2. @jackytom

    Questioner

    回答ありがとうございます。
    1.理解しました。HTML側のonclickは削除しました。
    2.理解しました。nameを指定しました。
    3.理解しました。falseを削除しました。
    追記分.半角スペースに修正しました。
    その上で再度ソースを再考しました。
    やりたいのは、クリアボタンをクリックしたら、
    (1)入力した項目をクリアする
    (2)ステータスを未選択にする。
    要は1回のクリックで、2つの処理が発生します。
    しかしながら、2つ目の処理(入力した項目のクリア)だけしか動きません。
    2つとも行う方法をご教示いただければ有難いです。

    		document.addEventListener('DOMContentLoaded', function() {
    			document.getElementById('clear').addEventListener('click', function index(){
    				var select = document.getElementById('status');
    				select.selectedIndex = 0;
    				});
    			document.getElementById('clear').addEventListener('click', function del(){
    				document.conditions.reset();
    				});
    		});
    
  3. (1)入力した項目をクリアする
    (2)ステータスを未選択にする。
    要は1回のクリックで、2つの処理が発生します。
    しかしながら、2つ目の処理(入力した項目のクリア)だけしか動きません。

    ちぐはぐな記述です.ご確認いただければと存じます.
    必要がなければ,addEventListenerを同じイベントに複数回呼ぶのはやめましょう.リファクタリングの障害になります.

  4. @jackytom

    Questioner

    回答ありがとうございます。
    下記で上手くいきました。
    document.getElementById('clear').addEventListener('click', function(){
    let select = document.getElementById('status');
    let sdate = document.getElementById('sdate')
    let edate = document.getElementById('edate')
    select.selectedIndex = 0;
    document.conditions.reset();
    sdate.value = "";
    edate.value = "";
    },false)

Your answer might help someone💌