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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

640閲覧

表示中の画像srcを取得したい(javascript)

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/03/01 03:27

編集2018/03/02 06:53

###【目的】
ボタンクリック時に、スライダーで表示中の画像srcを取得したいです。(>_<)

その画像srcをラジオボタンのvalueに挿入しているのですけれど、どうしても画像srcが取得できません。

###【試しているコード】
下記コード8行目var src = $(this).parent().find('.slide img').attr('src');を試してみました。

しかし、表示中の画像srcでなく、スライダー1枚目の画像srcが取得されてしまいます。

現状の動作、図、コードを貼っておきますので、ご確認頂ければ幸いです。

■現状の動作↓
https://jsfiddle.net/3pe0j501/27/

■現状の図↓
イメージ説明

■現状のコード↓

html

1<!-- 【スライダー】 --> 2<p class="func">▼画像スライダー</p> 3<section id="AB"> 4<section id="A"> 5 <div class="slider"> 6 <div class="slideSet"> 7 8 <div class="slide">neko1<img src="http://example.com/wp-content/themes/theme-child/images/neko1.jpg" class="img"></div> 9 10 <div class="slide">neko2<img src="http://example.com/wp-content/themes/theme-child/images/neko2.jpg" class="img"></div> 11 12 </div> 13 </div> 14 <div class="btn">ボタン</div> 15</section> 16 17<section id="B"> 18 <div class="slider"> 19 <div class="slideSet"> 20 21 <div class="slide">inu1<img src="http://example.com/wp-content/themes/theme-child/images/inu1.jpg" class="img"></div> 22 23 <div class="slide">inu2<img src="http://example.com/wp-content/themes/theme-child/images/inu2.jpg" class="img"></div> 24 25 <div class="slide">inu3<img src="http://example.com/wp-content/themes/theme-child/images/inu3.jpg" class="img"></div> 26 27 </div> 28 </div> 29 <div class="btn">ボタン</div> 30</section> 31</section> 32 33<!-- 【ラジオvalue連動】 --> 34<p class="ques">▼valueを表示中の画像ファイル名にしたい</p> 35<input class='abc' type=radio value='ボタンクリック前' checked><span>value=</span><span id="output"></span>

javascript

1////ボタンクリックしたときの機能 2(function($){ 3$(document).ready(function(){ 4 5 $(".btn").click(function(){ 6 7 // 表示中の画像srcを取得したいのに、最初の画像srcしか取得できない 8 var src = $(this).parent().find('.slide img').attr('src'); 9 10 // 取得したsrcをvalueに挿入 11 var splittedUrl = src.split('/') 12 document.getElementsByClassName("abc")[0].value = splittedUrl[splittedUrl.length - 1].split('.')[0]; 13 14 }) 15 16}); 17})(jQuery); 18 19 20////検証のためのvalue表示 21var target = document.getElementsByClassName("abc")[0]; 22var output = document.getElementById("output"); 23setInterval(function(){ 24output.innerHTML = target.value; 25},10); 26 27 28////スライダー機能 29(function(){ 30 31// 初期設定 32$('.slideSet').each(function(index,element){ 33 var $this = $(element); 34 var $slides = $this.find('.slide'); 35 $this.data('slideWidth' , $slides.eq(0).outerWidth()); 36 $this.data('slideNum' , $slides.length); 37 $this.data('slideSetWidth' , 38 $slides.eq(0).outerWidth() * $this.data('slideNum') ); 39 $this.css('width', $this.data('slideSetWidth')); 40 41 $this.data('slideCurrent', 0); 42 43}); 44 45 // アニメーションを実行する独自関数 46 var sliding = function($this){ 47 48 var slideCurrent = $this.data('slideCurrent'); // クリックした要素の現在地 49 var slideNum = $this.data('slideNum'); 50 var slideWidth = $this.data('slideWidth'); 51 52 // slideCurrentが0以下だったら 53 if( slideCurrent < 0 ){ 54 slideCurrent = slideNum - 1; 55 56 // slideCurrentがslideNumを超えたら 57 }else if( slideCurrent > slideNum - 1 ){ // slideCUrrent >= slideNumでも可 58 slideCurrent = 0; 59 60 } 61 62 $this.stop().animate({ 63 left: slideCurrent * -slideWidth 64 }); 65 66 $this.data('slideCurrent' , slideCurrent); // 移動したので再代入 67 } 68 69 // 画像が押されたとき 70 $('.slideSet').click(function(){ 71 var $this = $(this); 72 73 var num = $this.data('slideCurrent') + 1; 74 // $('body').append('<p>'+num+'</p>'); 75 $this.data('slideCurrent',num); 76 sliding($this); 77 }); 78 79}());

css

1/*スライダーのCSS*/ 2.slide { 3 width: 100px; 4 height: 50px; 5 border: 1px solid #888; 6} 7img { 8 width: 100px; 9 height: 50px; 10} 11.slideSet > div { 12 width: 100px; 13 height: 50px; 14 box-sizing: border-box; 15 } 16 17 .slide { 18 float: left; 19 } 20 21 .slideSet { 22 position: absolute; 23 } 24 25 .slider { 26 width: 100px; 27 height: 50px; 28 overflow: hidden; 29 position: relative; 30 } 31 32/*装飾のCSS*/ 33#AB { 34 display: flex; 35} 36#A, #B { 37 margin: 0 20px 0 0px; 38} 39.btn { 40 background: #0a7cff; 41 width: 100px; 42 border-radius: 10px; 43 color: #FFF; 44 font-weight: bold; 45 text-align: center; 46 margin: 10px 0 0px 0; 47 cursor: pointer; 48} 49.ques { 50 background: #FF6565; 51 padding: 5px; 52} 53.func { 54 background: #ddd; 55 padding: 5px; 56}

以上です。
長くなってしまってスミマセン。
どうぞよろしくお願いいたします。m(_ _)m

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

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

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

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

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

guest

回答2

0

ざっとみた感じ、$(".btn").click(function(){...})$('.slideSet').each(function(index,element){...})の中に書いたほうがいいのではないかな、と思いました。
複製ボタンを含めて要素をラップして、それに対して.each()メソッドを使い、クロージャで処理すれば、ややこしいことが減りそうな……?

投稿2018/03/02 03:22

Lhankor_Mhy

総合スコア36115

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

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

退会済みユーザー

退会済みユーザー

2018/03/02 07:07

それに対して.each()メソッドを使い、クロージャで処理する、と、おっしゃいますと…??もう一歩お願いいたします。m(_ _)m
Lhankor_Mhy

2018/03/02 07:19

いや、kszk311さんの回答の方向でいいと思います。 上手くいかないのは、$('.slideSet')が別のスライダーを参照しているせいです。そこを修正したところ、正常に動作確認できました。
退会済みユーザー

退会済みユーザー

2018/03/02 07:44 編集

元の質問(画像を複製する機能があるもの)に対する、kszk311さんのご回答を追記したものが下記ですけれど、、 https://jsfiddle.net/3pe0j501/32/ nekoはバッチリですけれど、これだとやっぱりinu側の複製がおかしくないですか?(@_@)
Lhankor_Mhy

2018/03/02 07:36

kszk311さんのご回答 var src = $('.linkimg .slide:nth-child('+parseInt($('.slideSet').data('slideCurrent')+1)+') img').attr('src'); がコードに見当たりませんでした。 再度確認してください。
退会済みユーザー

退会済みユーザー

2018/03/02 07:44

大変失礼いたしました!リンク先修正しておきました。
Lhankor_Mhy

2018/03/02 07:53

繰り返しになりますが、上手くいかないのは、$('.slideSet')が別のスライダーを参照しているせいです。修正してください。
退会済みユーザー

退会済みユーザー

2018/03/02 08:11

すみません、別のスライダー、と仰いますと…? まったくの素人でして、直す場所に検討がつかず、苦戦しております。 またお手すきの折にご教示いただけましたら幸いです。。
Lhankor_Mhy

2018/03/02 08:12

ご提示のサンプルでは、$('.slideSet')は3つ存在します。 ここまではいいですか?
退会済みユーザー

退会済みユーザー

2018/03/02 08:14

はい。 //src変更機能 // 初期設定 // 画像が押されたとき の位置の3つですね。
退会済みユーザー

退会済みユーザー

2018/03/02 08:16

わ、うれしいです。魚をやるのではなく、釣り方を教えようとして下さっているのですね♪
Lhankor_Mhy

2018/03/02 08:24

その場合、 $('.slideSet').data('slideCurrent') は、3つあるうちの一番初めの要素の値を返します。この場合は、nekoの方です。 なので、nekoは上手くいきますが、inuは現在のnekoと同じ番目の画像が表示されるはずです。 ですから、$('.slideSet') を .linkimg 内にあるスライダーに限定する必要があります。 この書き方は分かりますか?
退会済みユーザー

退会済みユーザー

2018/03/02 08:34

なるほどなるほど。ところで、 >$('.slideSet') を .linkimg 内にあるスライダーに限定する とありますけれど、下記の↓ var src = $('.linkimg .slide:nth-child('+parseInt($('.slideSet').data('slideCurrent')+1)+') img').attr('src'); こちらの部分↓ $('.linkimg .slide が、まさに「.linkimg 内にあるスライダーに限定する」という意味ではないのでしょうか?? と、いう風に考えてしまいます。。
Lhankor_Mhy

2018/03/02 08:39

はい、そのとおりです。 $('.linkimg .slide:nth-child('+parseInt($('.slideSet').data('slideCurrent')+1)+') img') このコードは、分解すると、 $( '.linkimg .slide:nth-child(' +parseInt( $('.slideSet').data('slideCurrent') +1 )+ ') img' ) ということです。 よく見ると、二つ目の $ オブジェクトはメソッドチェーンが届いているわけではないので、改めて限定する必要があります。
退会済みユーザー

退会済みユーザー

2018/03/02 08:57

つまり、 二つ目の $ オブジェクト ↓ $('.slideSet') を「.linkimg 内にあるスライダーに限定する」わけですね。 すると、下記に書き換えればできそう! $('.linkimg .slide .slideSet') …な予感がしたのですけれど、ダメですね。笑 他にもいくつか書き換えてみたのですが、どうも限定するために必要な部分を抜き出すことができません。
Lhankor_Mhy

2018/03/02 09:27

おしいですよ。 jQueryもCSSも同じなのです。 ␣(半角スペース)は「子孫セレクタ」と呼ばれるものです。 .linkimg␣.slide␣.slideSet は、.linkimg の子孫の .slide の子孫の .slideSet、という意味です。 実際には、.slide の子孫に .slideSet はないですよね。
退会済みユーザー

退会済みユーザー

2018/03/02 09:52

あ、ほんとですね。たしかに、.slideSet は .slide の子孫にはありませんでした。 えー??でもそうすると、、、 $('.linkimg .slide img') か、または全部子供たちを指定して $('.linkimg .slider .slideSet .slide img') などをすれば、で、でき、できるハズじゃないですか!!!笑
Lhankor_Mhy

2018/03/02 10:06

親子関係を全部書く必要はないです。 祖父␣父␣子 ではなくて、 祖父␣子 の2つだけで十分です。 $('.slideSet').data('slideCurrent') これは、.slideSet にキャッシュした slideCurrent のデータを読み込め、という意味です。 なので、.slideSet の子孫までさかのぼってしまうと、データが取れなくなります。.slideSet で止めてください。
退会済みユーザー

退会済みユーザー

2018/03/02 10:40

.slideSet 以前まで、かつ、2つで十分 そうしますと、 $('.linkimg .slider')か $('.linkimg .slideSet')のいずれか、 ですよね? …泣きそうです。笑
Lhankor_Mhy

2018/03/02 11:33

そうですね。 .slideSetのデータを取ろうとしているのですから、後者ですね。
退会済みユーザー

退会済みユーザー

2018/03/02 12:38 編集

んっと、まってください? 後者によって「.linkimg 内にあるスライダーに限定する」ができたということでしょうか? やってみたのですけれど、、、 https://jsfiddle.net/3pe0j501/60/ …泣きそうなんですw教えていただけませんでしょうか?(>_<)
Lhankor_Mhy

2018/03/02 12:13 編集

あー、スライダーだけではなくて、その下にも反映したいのですか。 それは失礼しました。問題を読み間違えていました。 var cloneObject = $(this).parent().find(".slider").clone( true ); と、true を追加してください。
退会済みユーザー

退会済みユーザー

2018/03/02 12:44

泣きました。できました。うれし半泣きです。本当にありがとうございます。自分なりに苦労したので喜びもひとしおです。うれしいよおおお!!! 何度も、何度も何度もお付き合い頂き、ほんっとうに!どうもありがとうございます。
Lhankor_Mhy

2018/03/02 12:56

解決したようで何よりです。 ただ、これはkszk311さんのご回答なので、BAはそちらにつけていただけませんか。私はフォローしただけですので(あちらのコメントでやればよかったですね)。
退会済みユーザー

退会済みユーザー

2018/03/02 12:57

かしこまりました。そのように致します。素敵な気配りですね。
kszk311

2018/03/02 13:30

本日連絡出来ずにすみませんでした。やりとり拝見させて頂きました。Lhankor_Mhyさん、ありがとうございました。
guest

0

ベストアンサー

複製ボタンを押した時、表示されている要素(neko1ならneko1の要素)が複製されているのではなく、
.sliderを丸ごと入れて、CSS(left)で表示を変えていたのですね。

本来ならば、複製ボタンを押した時に、その要素のみを入れたいところですが、sliderの挙動を変えずにやるのなら、「slideCurrent」を取得する必要があります。

0,1で取得され、セレクタはnth-childなので、+1しています。

javascript

1 //src変更機能 2 var src = $('.linkimg .slide:nth-child('+parseInt($('.slideSet').data('slideCurrent')+1)+') img').attr('src'); 3

投稿2018/03/01 04:14

kszk311

総合スコア3404

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

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

退会済みユーザー

退会済みユーザー

2018/03/01 22:58 編集

ご回答ありがとうございます。 ところで、実はスライダーは2枚だけでなく、3枚だったり、もっと多かったりもします、、泣 (最初の質問では2枚しか載せておらず失礼しました。質問文を修正いたしました。) この不確定な枚数についても同じように機能させることは可能でしょうか…? ご教示いただいた「+1」ですと、たとえばinu3を複製したときに、inu3でなくinu1のsrcが取得されてしまう様子なので、これまた困ってしまいました。。 思いつくこと、ヒントなどなんでもご教示いただけましたら幸いです。
退会済みユーザー

退会済みユーザー

2018/03/02 12:59

こんばんは。Lhankor_Mhyさんのフォローもあり、お蔭さまで解決いたしました。ご回答どうもありがとうございました!!
kszk311

2018/03/02 13:43

いえいえ、解決できて何よりです。2つある場合だと不十分でしたね、失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問