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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

725閲覧

ボタンで画像を変更するスライドショーを作りたい

onigiri-sake

総合スコア11

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/12/03 14:35

編集2019/12/22 15:17

実現したいこと

jQueryでボタンクリックで画像を変更できるスライドショーを作成しています。
スライドの関数を作り、イベントの中で関数に引数として値を投げているイメージです。
if文で「pres」「next」を判別しています。
関数名、引数名は仮名です。

<追記>
一部修正しました。関数内に変数を閉じ込めると関数実行の度に変数が宣言され、値がリセットされてしまっていると考え、クロージャにて再度実装しました。

発生した問題・解決したい問題

変数を関数スコープかイベントの中に閉じ込めたいのですが、イベント内・関数内に閉じようとしたらうまく動作しない。
関数・イベントの外で宣言したら動作しました。
おかしいところのアドバイスを頂きたいです。

<追記>
クロージャにて一部コード修正しましたが、機能しません。
クロージャの扱いが間違っているのか、その他の要因があるのか、アドバイスを頂きたいです。

HTML

1<div class="slider-area"> 2  <ul class="slider-list clearfix"> 3 <li><img src="img/1.jpg" alt=""></li> 4 <li><img src="img/2.jpg" alt=""></li> 5 <li><img src="img/3.jpg" alt=""></li> 6 <li><img src="img/4.jpg" alt=""></li> 7 </ul> 8 <button type="button" class="slider-ctrl-btn prev" data-ctrl="prev"></button> 9 <button type="button" class="slider-ctrl-btn next" data-ctrl="next"></button> 10</div>

javascript

1$(function(){ 2/** 3 *スライド全体を横に移動させる 4 *左端までいくと最後の画像に移動する 5 *右端までいくと最初の画像に戻る 6 * 7 *@param {num} current : 現在地の増減 8 */ 9function slideShow(){ 10 let slideWidth = $('.slider-list').find('li').width(), 11 slideNum = $('.slider-list').find('li').length, 12 slideListWidth = slideWidth * slideNum, 13 slideCurrent = 0, 14 myObj = new Object(); 15 /** 16 *スライド全体の幅を挿入する 17 */ 18 $('.slider-list').css('width',slideListWidth); 19 myObj.slideFunc = function (current){ 20 current; 21 if(slideCurrent < 0){ 22 slideCurrent = slideNum -1; 23 } 24 else if(slideCurrent > slideNum -1){ 25 slideCurrent = 0; 26 } 27 $('.slider-list').animate({ 28 left : slideCurrent * -slideWidth 29 }); 30 } 31 myObj.getCurrent = function (){ 32 return slideCurrent; 33 } 34 return myObj; 35} 36let slideCount = slideShow(); 37 38/** 39 *クリックイベント 40 *ボタンクリックで進む・戻る 41 */ 42$('.slider-area').find('button').on('click',function(){ 43 let currentCount = slideCount.getCurrent(); 44 if($(this).hasClass('next')){ 45 slideCount.slideFunc(currentCount++) 46 } 47 else{ 48 slideCount.slideFunc(currentCount--) 49 } 50}); 51});

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

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

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

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

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

2KOH

2019/12/03 14:46

> グローバル変数が使用不可のため そもそも「動作する」というコードにもグローバル変数なんて宣言されていない(正確には $ が定義されていますが)ので、「動作する」というコードで何も問題ないのでは?
onigiri-sake

2019/12/03 15:00

すみませんグローバル変数の解釈を間違えておりました。 関数スコープかイベントの中に閉じ込めたい、という意味合いでの質問でした。 勉強不足により情報が曖昧で申し訳ございません。
2KOH

2019/12/03 15:23

「動作する」というコードはすでに関数スコープですよ? これではダメというのであれば、 $(function(){ (function(){ // ここにすべてのコードを書く。 })(); }); のようにするのはどうですか? こんなことをする意味は何もないですが。
onigiri-sake

2019/12/03 15:31

なるほど。。。 今一度仕様を確認してみます。 ご丁寧にありがとうございます!
guest

回答1

0

ベストアンサー

https://teratail.com/help/avoid-asking
どう見てもこのサイトで推奨されていない「デバッグしてください等の丸投げの質問」のように思えるので、簡単にだけ。

javascript

1myObj.slideFunc = function (current){ 2 current;

javascript

1myObj.slideFunc = function (current){ 2 slideCurrent = current;

に変更し、

javascript

1if($(this).hasClass('next')){ 2 slideCount.slideFunc(currentCount++) 3} 4else{ 5 slideCount.slideFunc(currentCount--) 6}

javascript

1if($(this).hasClass('next')){ 2 slideCount.slideFunc(++currentCount) 3} 4else{ 5 slideCount.slideFunc(--currentCount) 6}

に変更してください。

投稿2019/12/23 10:42

2KOH

総合スコア999

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

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

onigiri-sake

2019/12/23 21:26

回答頂きありがとうございます! たしかにサイトの主旨に適さない質問でした。失礼しました。 以後気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問