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

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

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

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

jQuery

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

Q&A

解決済

4回答

7215閲覧

jqueryのグローバル変数を呼び出す方法

mhl

総合スコア34

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2016/02/03 06:32

編集2016/02/03 07:11

グローバル変数をfunction内に呼び出したいと思っています。

javascript

1var hoge = $('.hoge').val(); 2$('#sample').click(function(){ 3 $('.hoge-hoge').text(hoge); 4}); 5$('#sample-2').click(function(){ 6 $('.hoge-hoge-hoge').text(hoge); 7});

このようにidがsampleかsample-2のボタンを押したらhogeのclassに書いてあるテキストがidがsampleの場合hoge-hogeのクラスに表示されidがsample-2の場合hoge-hoge-hogeに表示されるようにしたいのですがこの書き方だと、うまく表示されません

javascript

1$('#sample').click(function(){ 2 var hoge = $('.hoge').val(); 3 $('.hoge-hoge').text(hoge); 4}); 5$('#sample-2').click(function(){ 6 var hoge = $('.hoge').val(); 7 $('.hoge-hoge-hoge').text(hoge); 8});

この書き方だとうまく表示されるのですが、var hoge = $(.hoge).val();を二回書かずに一回だけで済ませたいのですがどうすればよろしいでしょうか?
かなり初歩的な質問かもしれませんがよろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

原因は ShunsukeIzui さんの仰る通りだと思います。
一つ気になったのですが、$(.hoge).val() の行で SyntaxError になりますね(セレクタが文字列化されていません)。
その部分を修正してハンドラ関数を一つにまとめたコードが下記になります。

(2016/2/3 16:33追記) jsfiddle で jquery.js を読み込む設定にしていなかったのと修正

HTML

1<input class="hoge" value="replaced!" /> 2<p id="sample-1">#sample-1</p> 3<p class="hoge-hoge">Hello, World!</p> 4<p class="hoge-hoge">Hello, World!</p> 5<p id="sample-2">#sample-2</p> 6<p class="hoge-hoge-hoge">Hello, World!</p> 7<p class="hoge-hoge-hoge">Hello, World!</p> 8<script> 9'use strict'; 10jQuery(function (jQuery) { 11 function handleClick (event) { 12 var data = event.data; 13 14 data.element.text(data.value); 15 } 16 17 function main () { 18 var value = jQuery('.hoge').val(); 19 20 jQuery('#sample-1').on('click', {element: jQuery('.hoge-hoge'), value: value}, handleClick); 21 jQuery('#sample-2').on('click', {element: jQuery('.hoge-hoge-hoge'), value: value}, handleClick); 22 } 23 24 main(); 25}); 26</script>

(2016/2/3 18:33追記)
別解。data-* 独自属性を使えばスマートに書けます。

HTML

1<input class="hoge" value="replaced!" /> 2<p id="sample-1" class="foo" data-target-selector=".hoge-hoge">#sample-1</p> 3<p class="hoge-hoge">Hello, World!</p> 4<p class="hoge-hoge">Hello, World!</p> 5<p id="sample-2" class="foo" data-target-selector=".hoge-hoge-hoge">#sample-2</p> 6<p class="hoge-hoge-hoge">Hello, World!</p> 7<p class="hoge-hoge-hoge">Hello, World!</p> 8<script> 9'use strict'; 10jQuery('.foo').on('click', {value: jQuery('.hoge').val()}, function handleClick (event) { 11 jQuery(this.getAttribute('data-target-selector')).text(event.data.value); 12 jQuery(this).off(event.type, handleClick); // 2回目以降は無意味なのでイベントを削除しておく 13}); 14</script>

Re: mhl さん

投稿2016/02/03 07:22

編集2016/02/03 09:34
think49

総合スコア18162

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

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

think49

2016/02/03 07:29

癖でscript要素を後に書きましたが、この書き方ならば jQuery(function () {}) が不要です。 script要素を</body>手前に置くのも解決手段の一つだと思います。
mhl

2016/02/18 02:34

ありがとうございます! 無事に解決しました!
guest

0

要件にそうかわかりませんが、以下の方法もありかと思います。

javascript

1$('#sample, #sample-2').click(function(){ 2 var hoge = $('.hoge').val(); 3 $('.hoge-hoge').text(hoge); 4});

投稿2016/02/03 08:09

icham

総合スコア559

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

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

think49

2016/02/03 11:24

その方法をとるなら #sample-2 で $('.hoge-hoge-hoge') を参照するように分岐処理が必要ではないでしょうか。 jQuery('#sample-1,#sample-2').on('click', function () { jQuery({'sample-1': '.hoge-hoge', 'sample-2': '.hoge-hoge-hoge'}[this.id]).text(jQuery('.hoge').val()); });
icham

2016/02/04 02:18

取得するテキストが違うのを見落としてました! ご指摘ありがとうございます。
guest

0

button id=hog
button id=pig
label id=label-hog
label id=label-pig
input id=inp
という構成で、

html

1$(function() { 2 $("x").on("click", function(e) { 3 var v = $("#inp").val(); 4 $("#"+"label-"+e.target.id).text(v); 5 }); 6}); 7 8

こんな感じです。ボタンa には、hoge1 が、ボタンb には、hoge2 がそれぞれ対応するなら、ラベルのid は、ラベルの名前ーボタンの名前、っていう風に紐づけるようにしておけば少ない記述で実装できますね。
"x" は、ボタン2つを囲った何かです。
適当に調整してください。コピペじゃ動きません。

投稿2016/02/03 07:46

ipadcaron

総合スコア1693

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

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

mhl

2016/02/18 02:33

ありがとうございます! 参考にしてみます!
guest

0

おそらくDOMの準備が整う前に実行されてしまっているためだろうと思います。
次のコードで試してみてください。

javascript

1$(function(){ 2 var hoge = $(.hoge).val(); 3 $('#sample').click(function(){ 4 $('.hoge-hoge').text(hoge); 5 }); 6 $('#sample-2').click(function(){ 7 $('.hoge-hoge-hoge').text(hoge); 8 }); 9});

投稿2016/02/03 06:53

編集2016/02/03 06:54
orange0190

総合スコア1698

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

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

mhl

2016/02/03 07:02

ご返答ありがとうございます! 上記のコードで試しましたが、表示されませんでした・・・
think49

2016/02/03 07:25

質問本文の修正前にあった下記コードが原因だと思われます。 var hoge = $(.hoge).val(); その点を修正して管理方法を変えたコードを別回答で挙げてみました。
orange0190

2016/02/03 08:05

ああ、セレクタのミスに気が付きませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問