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

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

ただいまの
回答率

90.34%

  • JavaScript

    17604questions

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

関数の呼び出し時に、対象の要素だけを変更することはできるのでしょうか?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 426

saiboutai

score 46

下記のように3つのバージョンがある場合、クリックするボタン要素やチェックするinputタグが別の物になるのですが、
両方バージョンを実行すると1と2が反応したり、こちらを実行したことになってしまう問題があります。
このような場合対象の要素だけを変更しないといけないですが、そのようなことはできるのでしょうか?
関数の呼び出し時に引数にID名を入れたりしても、対象の要素のみを変えることはできないですよね。

shoppingCalcの計算関数を定義。(バージョン1と両方バージョンで使う)
shoppingGramの計算関数を定義。(バージョン2と両方バージョンで使う)



//バージョン1
shoppingCalcの計算用の値を取得
let shoppingCalc = document.getElementById('shoppingBtn').onclick = () => {
shoppingCalcの計算関数を呼び出す。
shoppingCalcの計算結果を表記。
};



//バージョン2
shoppingGramの計算用の値を取得
let shoppingGram = document.getElementById('shoppingBtn').onclick = () => {
shoppingGramの計算関数を呼び出す。
shoppingGramの計算結果を表記。
};


//上記両方バージョン
let getIdshoppingBtn= document.getElementById('shoppingAllBtn');
let shoppingCalcAll = getIdshoppingBtn.addEventListener('click', ()=> {
    shoppingCalcの計算関数を呼び出す。
    shoppingGramの計算関数を呼び出す。
  shoppingCalcの計算結果と、shoppingGramの計算結果を上記と別の所に表記
});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • saiboutai

    2017/02/28 17:12

    他の方にも伝わるようにこちらにもコメントします。HTMLの方もお伝えしないと伝わりませんで失礼しました。 バージョン1 バージョン2 両方のバージョンが同じ値を使って計算し同じ場所に結果を表記するのであれば 仰る通りですが、 それぞれinputに入力するpriceやgramが独立していて、計算結果も、それぞれの場所に表記したい場合は、同じinputを参照したり、両方バージョンのボタンを押すとバージョン2にも結果が出てしまうと問題ですよね。 つまりそれぞれを分離独立させたいという事です。 その場合両方バージョンがバージョン1と2と同じ場所を参照しないようにして、 しかも始めの関数を再利用するためには、どのようにIDを取得すれば実現できますかという事をお聞きしたかったのです。 説明不足で大変恐縮ですが、同じ関数を使うが対象のID要素だけは変更するという事は実現できないので、 同じ関数を使うことを諦めて、バージョン数分同じ関数を記載してその中にあるID要素だけを変更する方法しかないでしょうか?

    キャンセル

  • kei344

    2017/02/28 18:30

    HTMLはどうなっていますか?

    キャンセル

  • saiboutai

    2017/02/28 19:00

    「情報を取ってくる」「表示する」はやはり対象の要素が違うので再利用はできず、 三つ分作らないといけないが、 「計算する」だけは共有できるのでここだけ関数にして再利用する方法があるという事ですね。 やはり違う要素を自動変換するようなことはできませんね。こちらが結論のようですね。理論上不可能であればそれでいいです。ありがとうございました。

    キャンセル

回答 2

+2

イベントハンドラ関数の設定パラメータを外部から受け取るようにすればいいのではないかと。
一つは対象の要素の data-* 属性に埋め込む方法。

<input id="calc" type="button" value="calc" data-calc="true" />
<input id="gram" type="button" value="gram" data-gram="true" />
<input id="calc-gram" type="button" value="calc+gram" data-calc="true" data-gram="true" />

もう一つは addEventListener の第二引数のオブジェクトに埋め込む方法。

<input id="calc" type="button" value="calc" />
<input id="gram" type="button" value="gram" />
<input id="calc-gram" type="button" value="calc+gram" />

<script>
'use strict';
const shoppingCalc = (a, b) => a + b;
const shoppingGram = (a, b) => a * b;
function handleEvent (event) {
  var a = 3, b = 2;

  if (this.calc) {
    console.log('calc', shoppingCalc(a, b));
  }

  if (this.gram) {
    console.log('gram', shoppingGram(a, b));
  }
}

document.getElementById('calc').addEventListener('click', {calc: true, handleEvent: handleEvent}, false);
document.getElementById('gram').addEventListener('click', {gram: true, handleEvent: handleEvent}, false);
document.getElementById('calc-gram').addEventListener('click', {calc: true, gram: true, handleEvent: handleEvent}, false);

Re: saiboutai さん

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/28 19:14

    ありがたいです。ちょっと手が離せなくなったので、また後で見せてもらいますね

    キャンセル

  • 2017/03/01 14:19

    難しいですね。
    data-* 属性を使えばこのdata-* 属性がある要素を指定できるようなので

    document.getElementById('calc').addEventListener('click', {calc: true, handleEvent: handleEvent}, false);
    とは第二引数にオブジェクトでプロパティ名と値を記載すると、
    下記と完全一致した時のみcalcIDの要素を取得できるという事でしょうか?
    value="calc" data-calc="true"

    一つでも当てはまらなければ取得しないで、計算は実行されないので、
    上記一つを複数の計算で共有しても、干渉をしないで、使いまわせるという事でよろしいでしょうか?

    キャンセル

  • 2017/03/01 14:44

    https://codepen.io/anon/pen/pejBVe
    に再現したのですが、ボタンののみで、値を入力する欄がありませんが、
    値を入れる欄は別途作るという事でしょうか?

    キャンセル

  • 2017/03/01 14:59

    > data-* 属性を使えばこのdata-* 属性がある要素を指定できるようなので
    data-* 属性の手法については「オブジェクトに埋め込む手法で this.calc」で参照していたパラメータを getAttribute や element.dataset に置き換えて下さい。

    > 値を入れる欄は別途作るという事でしょうか?
    そうですね。
    質問の本題は「イベントハンドラ関数を3つ作るのを避けたい」なので、値の入力処理は質問文になかった事もあってあえて触れませんでした。
    既存のコードがあるはずなので、提案した手法を既存コードに上手く組み込んでみてください。

    キャンセル

  • 2017/03/01 18:31

    初心者なのでオブジェクトに埋め込む手法というのが難しくてよくわかりませんが


    >>>
    data-* 属性を使えばこのdata-* 属性がある要素を指定できるようなので

    document.getElementById('calc').addEventListener('click', {calc: true, handleEvent: handleEvent}, false);
    とは第二引数にオブジェクトでプロパティ名と値を記載すると、
    下記と完全一致した時のみcalcIDの要素を取得できるという事でしょうか?
    value="calc" data-calc="true"


    この認識でだいたいあってはいるのですね?

    キャンセル

  • 2017/03/02 09:17

    その後調べて自分でdataのサンプルを作ったのですが、JSの変数の二つ目が、
    getAttributeがundefiedと出てしまいます。
    どこに間違えがあるかご存知でしょうか?

    https://codepen.io/anon/pen/Qpymwx?editors=1112

    キャンセル

  • 2017/03/03 13:25

    再質問にした方が良いでしょうか?
    そうであれば再質問にします。

    キャンセル

checkベストアンサー

+1

質問を編集しているうちに、ほぼ答えにたどり着いたようにも見受けられます。

つまり、計算部分と表示部分は分離して、計算部分だけを両方計算するところで使えばいいわけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/28 17:12

    HTMLの方もお伝えしないと伝わりませんで失礼しました。

    バージョン1
    バージョン2
    両方のバージョンが同じ値を使って計算し同じ場所に結果を表記するのであれば
    仰る通りですが、
    それぞれinputに入力するpriceやgramが独立していて、計算結果も、それぞれの場所に表記したい場合は、同じinputを参照したり、両方バージョンのボタンを押すとバージョン2にも結果が出てしまうと問題ですよね。
    つまりそれぞれを分離独立させたいという事です。

    その場合両方バージョンがバージョン1と2と同じ場所を参照しないようにして、
    しかも始めの関数を再利用するためには、どのようにIDを取得すれば実現できますかという事をお聞きしたかったのです。
    説明不足で大変恐縮ですが、同じ関数を使うが対象のID要素だけは変更するという事は実現できないので、
    同じ関数を使うことを諦めて、バージョン数分同じ関数を記載してその中にあるID要素だけを変更する方法しかないでしょうか?

    キャンセル

  • 2017/02/28 17:17

    「情報を取ってくる」「計算する」「表示する」の3つに分ければ、真ん中は再利用可能です。

    キャンセル

  • 2017/02/28 18:21

    「情報を取ってくる」「表示する」はやはり対象の要素が違うので再利用はできず、
    三つ分作らないといけないが、

    「計算する」だけは共有できるのでここだけ関数にして再利用する方法があるという事ですね。
    やはり違う要素を自動変換するようなことはできませんね。

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    17604questions

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