質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2949閲覧

JS クリックイベントが勝手に繰り返し実行されてしまいます

退会済みユーザー

退会済みユーザー

総合スコア0

Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/04/09 02:34

やりたいこと

DBの検索結果を、htmlのテーブルで出力させるアプリを作っています。
クエリは全てgetで処理しています。

検索結果は500件ずつ表示させるので、そのボタンを作っています。

仕様

「次の500件」ボタンを押すと、現在のパスを取得し、
正規表現で多少の解析をしたのちに、
&move=next500
を付け足す。

コード

javascript

1var movepage= function(nexpre) { 2 var url=decodeURI(location.href); 3 var myregex1=new RegExp(/?/); 4 var myregex2=new RegExp(/&move=next500|&move=previous500/); 5 var myregex3=new RegExp(/page=([0-9]+)/); 6 7 url = url.replace(myregex2,""); 8 9 if(url.match(myregex1)==null){ 10 url+="?"; 11 } 12 13 if(url.match(myregex3)==null){ 14 url+="&page=1"; 15 }else{ 16 var curpagenum=url.match(myregex3); 17 if (nexpre==="next"){ 18 var newpagenum=Number(curpagenum[1]) + 1; 19 }else{ 20 var newpagenum=Number(curpagenum[1]) - 1; 21 } 22 var newpagestr="page=" + String(newpagenum); 23 url=url.replace(myregex3,newpagestr); 24 } 25 url += "&move=next500"; 26 window.location.href=url; 27}; 28 29 30var next500=document.getElementById("next500"); 31if(next500){ 32 next500.addEventListener("click",movepage("next")); 33}; 34

現象

以上のコードでwebページを開くと、
何もボタンをおさないうちから、クリックイベントに登録した関数が連続して実行され始めます。
つまり、勝手に「次の500件」が連続して動作し始め、次々にページが切り替わります。

なお、
movepage= function(nexpre){...
の関数定義をやめて、

js

1if(next500){ 2 next500.addEventListener("click",function(){ 3・・・

という風に直書きすると、正常に動作します。

質問

JSのことがあまり分かっていないので基本的なところで間違えているのかもしれません。
どのようにしたら解決するでしょうか。

なお、前の500件でも同じような処理をするので、重複を避けるため、直書きはしたくないと思っています(現状は暫定的に、2つとも直書きして無理矢理動かしています)。

よろしくお願いします。

(なお、はじめは普通にformからクエリを発行していたのですが、諸々の兼ね合いで、このJSの方式のほうが管理しやすいと思ってこうしました。最適なのかどうかわかりませんが、それ自体も問題があるということでしたら、ご指摘ください。また、JSのコードの作り方もここがよくないよ、などあったら遠慮無くご指摘ください)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

js

1// next500.addEventListener("click",movepage("next")); // 渡す瞬間に movepage が実行されてしまっている 2// ↓ 3 next500.addEventListener("click",function(){ movepage("next"); } );

投稿2018/04/09 02:39

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/09 06:16

ありがとうございます。無事に動きました。(関数に関数を渡しただけでなぜ即実行されるのか今ひとつ飲み込めていないのですがもう少し勉強してみます)
kei344

2018/04/09 06:30

movepage("next") は実行してますよ。関数だけを渡す場合は movepage のみですね。
退会済みユーザー

退会済みユーザー

2018/04/09 09:47

ああ、なるほど。言われてみればカッコを付けたら実行されますね… お恥ずかしい限りです。 すると、引数がつくときは、別の関数でラップしなくてはならない(コールバック?)ってことになるんですかね。
kei344

2018/04/09 11:07

> 引数がつくときは、別の関数でラップしなくてはならない(コールバック?)ってことになるんですかね。 「別の関数でラップ」は「無名関数にラップ」ですね。「コールバック」は後で使う関数を渡しておく場合全般に言います。(細かいですが) 無名関数以外にも、addEventListenerならhandleEventを使うとか、bindするとかありますが、私は無名関数を使うことが多いです。説明するのがちょっと難しいので、気になったら調べてみてください。 【addEventListenerのhandleEventについて - 7cc@はてなブログ】 http://7cc.hatenadiary.jp/entry/eventlistener-handleevent 【Javascriptのbind関数と部分適用 〜 JSおくのほそ道 #015 - Qiita】 https://qiita.com/hosomichi/items/e11ad0c4ea79db2dee84#%E3%81%9D%E3%81%AE2%E5%BC%95%E6%95%B0%E3%82%92%E4%BA%88%E7%B4%84%E3%81%99%E3%82%8B
退会済みユーザー

退会済みユーザー

2018/04/09 23:23

色々教えていただきありがとうございます。細かいご指摘大歓迎です(独学ですが本格派になりたいといつも思っています)。更に勉強してみます。ありがとうございます。
guest

0

addEventListenerの部分でmovepageを実行したらページ遷移するのは当たり前です.
イベントリスナには**movepageを呼び出す関数**を渡しましょう.

JavaScript

1if(next500){ 2 next500.addEventListener("click", e=>movepage("next")); 3}; 4

投稿2018/04/09 02:38

defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/09 06:16

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問