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

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

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

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

jQuery

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

Q&A

解決済

3回答

1645閲覧

javascript 動的に追加した要素にも関数を適用するには?

Izumo1101

総合スコア49

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/05/18 13:40

編集2020/05/18 16:14

teratailでIDを引数にして関数を回す方法を教えてもらいました。

HTML上にある要素のIDをhannmaa_dayo("panPinch","panPinchElm");と定義づけ引数にして関数に渡している、という感覚です(正しいのでしょうか)。

しかしこの場面で、新しい要素を追加した場合、すでにある関数に追加した要素のIDをどのように渡してどのように稼働させていいか分かりません。

おそらく基本的なことなのでしょうがご教示ください。よろしくお願いします。

全文を追記しておきます

html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width,initial-scale=1"> 6<title>タッチデバイスとパソコンデバイス</title> 7<script src="src/jquery-3.5.1.min.js"></script> 8<script src="src/hammer.js"></script> 9 10 11 12<style> 13*{ 14 padding: 0; 15 margin: 0; 16} 17body{ 18 color: #666; 19 font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; 20} 21h2 { 22 margin-bottom: 15px; 23 text-align: center; 24} 25main { 26 max-width: 960px; 27 margin: 30px auto; 28} 29#panPinch{ 30 width: 100%; 31 padding-bottom: 50%; 32 margin-bottom: 30px; 33 background: #ffe8ab; 34 position: relative; 35} 36 37#panPinch .element { 38 width: 120px; 39 height: 120px; 40 background: #fff; 41 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25); 42 position: absolute; 43 top: 120px; 44 left: 120px; 45} 46 47.element{ 48transform: matrix(1, 0, 0, 1, 0, 0); 49} 50 51} 52</style> 53</head> 54 55<body> 56<main> 57 <h2>パンとピンチとマウスカーソル</h2> 58 <div class="wheel">1</div> 59 <div id="panPinch"> 60 <img class="element" id="panPinchElm" src="1.jpg" style="height:100px; z-index:2;"> 61 <img class="element" id="panPinchElm2" src="2.jpg" style="height:200px; width:200px;"> 62 </div> 63 64 <button id="btn1" style="position: absolute; z-index: 2;top:10px;left:10px;">要素生成</button> 65</main> 66<script> 67//document.createElement('main'); 68 $("#btn1").click(function () { 69 $('#panPinch').append('<img class="element" id="panPinchElm3" src="3.jpg" style="height:100px;">'); 70 console.log('押されました'); 71 hannmaa_dayo("panPinch","panPinchElm3"); 72 }); 73 74 75 76$(function () { 77 hannmaa_dayo("panPinch","panPinchElm"); 78 hannmaa_dayo("panPinch","panPinchElm2"); 79 //hannmaa_dayo("panPinch","panPinchElm3"); 80 81 //関数です、繰り返し使えます 82 function hannmaa_dayo(area_id,elem_id) { 83 var $tgPanPinchArea = document.getElementById(area_id), 84 $jqTgPanPinchArea = $($tgPanPinchArea), 85 $tgPanPinchElm = document.getElementById(elem_id), 86 $jqTgPanPinchElm = $($tgPanPinchElm), 87 $hammerObj = new Hammer($tgPanPinchElm), 88 $hammerObj2 = new Hammer($tgPanPinchArea), 89 panTime = false, 90 pinchTime = false, 91 $pinchTimer = {}; 92 $hammerObj.get("pan").set({ enable: true }); 93 $hammerObj.get("pinch").set({ enable: true }); 94 $jqTgPanPinchElm.css("transform", "scale(1)"); 95 96 //pan event 97 $hammerObj.on("pan", function (event) { 98 if (event.isFinal) { 99 //end 100 panTime = false; 101 $jqTgPanPinchArea.data("down", false); 102 if (Number(String($jqTgPanPinchElm.css("left")).replace("px", "")) < 0) $jqTgPanPinchElm.css("left", "0px"); 103 if (Number(String($jqTgPanPinchElm.css("left")).replace("px", "")) > $jqTgPanPinchArea.width() - $jqTgPanPinchElm.width()) 104 $jqTgPanPinchElm.css("left", $jqTgPanPinchArea.width() - $jqTgPanPinchElm.width() + "px"); 105 if (Number(String($jqTgPanPinchElm.css("top")).replace("px", "")) < 0) $jqTgPanPinchElm.css("top", "0px"); 106 if (Number(String($jqTgPanPinchElm.css("top")).replace("px", "")) > $jqTgPanPinchArea.outerHeight() - $jqTgPanPinchElm.height()) 107 $jqTgPanPinchElm.css("top", $jqTgPanPinchArea.outerHeight() - $jqTgPanPinchElm.height() + "px"); 108 } else { 109 if (!panTime) { 110 //start 111 panTime = event.timeStamp; 112 113 $jqTgPanPinchArea 114 .data("down", true) 115 .data("x", event.center.x) 116 .data("y", event.center.y) 117 .data("elmPosX", Number(String($jqTgPanPinchElm.css("left")).replace("px", ""))) 118 .data("elmPosY", Number(String($jqTgPanPinchElm.css("top")).replace("px", ""))); 119 } else { 120 //move 121 if ($jqTgPanPinchArea.data("down") == true) { 122 $jqTgPanPinchElm.css({ 123 left: $jqTgPanPinchArea.data("elmPosX") - ($jqTgPanPinchArea.data("x") - event.center.x) + "px", 124 top: $jqTgPanPinchArea.data("elmPosY") - ($jqTgPanPinchArea.data("y") - event.center.y) + "px", 125 }); 126 } 127 } 128 } 129 }); 130 131 //pinch event 132 $hammerObj.on("pinch", function (event) { 133 event.preventDefault ? event.preventDefault() : (event.returnValue = false); 134 if (!pinchTime) { 135 //start 136 pinchTime = event.timeStamp; 137 var preScale = String($jqTgPanPinchElm.css("transform")).replace("matrix(", ""); 138 preScale = preScale.replace(")", ""); 139 preScale = preScale.split(","); 140 preScale = Math.sqrt(preScale[0] * preScale[0] + preScale[1] * preScale[1]); 141 $jqTgPanPinchArea.data("preScale", preScale).data("scale", event.scale); 142 } else { 143 //move 144 if ($pinchTimer) clearTimeout($pinchTimer); 145 $jqTgPanPinchElm.css("transform", "scale(" + ($jqTgPanPinchArea.data("preScale") + (event.scale - $jqTgPanPinchArea.data("scale"))) + ")"); 146 $pinchTimer = setTimeout(function () { 147 //end 148 pinchTime = false; 149 }, 100); 150 } 151 }); 152 } 153}); 154</script> 155</body> 156</html>

皆さんの回答を参考に考えると、
hannmaa_dayo("panPinch","panPinchElm3");
という関数の呼び出し方は間違っていないのですよね?それだけでもちょっと収穫です。ありがとうございます。

デベロッパーツールのエラーコードを記載しておきます。
hammerTest.html:71
Uncaught ReferenceError: hannmaa_dayo is not defined
どうもappendでの記述内で関数を呼び出せていない気がします。

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

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

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

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

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

guest

回答3

0

こんにちは、
解釈があっているか怪しいですが、下のようになると思います。

javascript

1$("#btn1").click(function () { 2 var new_node = $('<img class="element" id="panPinchElm3" src="3.jpg" style="height:100px;">'); //新しいイメージを作成 3 var elem_id = new_node.attr("id"); //attr("id")でpanPinchElm3が取得できます。 4 5 var target_node = $("#panPinch").append(new_node); //panPinchに上で作成したイメージを追加 6 var area_id = target_node.attr("id"); //attr("id")でpanPinchが取得できます。 7 8 hannmaa_dayo("panPinch", "panPinchElm3"); 9 hannmaa_dayo(area_id, elem_id); //??????????? 10}); 11

投稿2020/05/18 15:57

fake_shibe

総合スコア806

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

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

Izumo1101

2020/05/18 16:17

ご回答の内容は上手にIDを振るやり方として非常に勉強になります。 ただやはり Uncaught ReferenceError: hannmaa_dayo is not defined と出るということは関数がうまく取れていないのですよね? どうも私の本文が根本的に間違っている気がします。申し訳ないです。
guest

0

追加するときにidも決めればいいのでは。

js

1var count = 2; 2$( '#btn1' ).on( 'click', function () { 3 count++; 4 $( '#panPinch' ).append( '<img class="element" id="panPinchElm' + count + '" src="' + count + '.jpg" style="height:100px;">' ); 5 hannmaa_dayo( 'panPinch', 'panPinchElm' + count ); 6} );

【Getting Started - Hammer.js】
https://hammerjs.github.io/getting-started/

↑このライブラリでしょうか?
だったらjQuery pluginがあるのでそれを使ったほうが書き方が統一できます。

投稿2020/05/18 15:54

kei344

総合スコア69606

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

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

Izumo1101

2020/05/18 16:18 編集

IDを付与していくためには、 $(function () { hannmaa_dayo("panPinch","panPinchElm"); hannmaa_dayo("panPinch","panPinchElm2"); //hannmaa_dayo("panPinch","panPinchElm3"); 以下略 の部分で初めにID番号3以上も読み込んでおけ、ということですよね? $(function () { hannmaa_dayo("panPinch","panPinchElm"); hannmaa_dayo("panPinch","panPinchElm2"); hannmaa_dayo("panPinch","panPinchElm3"); で走らせると jquery-3.5.1.min.js:2 Uncaught TypeError: Cannot read property 'addEventListener' of null を吐かれてしまうので、動的な記述内で関数を走らせたいのです。 意味不明な感じですね、すみません。 jquery.hammer.jsも試したのですが、 Uncaught SyntaxError: Unexpected token '<' を吐かれて、よくあるソースの記述ミスも疑ったのですが <script src="src/jquery-3.5.1.min.js"></script> <script src="src/hammer.js"></script> <script src="src/jquery.hammer.js"></script> 特に問題が見当たらずあきらめた次第です。
kei344

2020/05/18 16:16

> 番号3以上も読み込んでおけ、ということですよね? どこを読んだらそうなるのでしょうか。
Izumo1101

2020/05/18 16:20

申し訳ない、違いますね。 何個ひゃしても自動的にID振っていけばいい、ということですね? 理解が間違っていました。 ただやはり Uncaught ReferenceError: hannmaa_dayo is not defined となるということは関数の呼び出しが間違っているということでしょうか。
kei344

2020/05/18 16:35

どんなコードになったのかはわかりませんが、関数の定義した場所と使う場所のスコープが違うのでしょう。 質問文にコードブロックで追記してください。(決して元のコードを消さないでください)
guest

0

ベストアンサー

IDでやろうとするとhtmlを追加する都度イベントをセットする必要があるので、classなどのid以外のセレクターを拾ってイベントを設定するのはどうでしょうか?IDが必要ならイベント処理の中でIDを取得して使ってください
https://api.jquery.com/on/
selectorの説明を見てみてください

追記に対して

原因は追記された部分です。

$("#btn1").click(function () { $('#panPinch').append('<img class="element" id="panPinchElm3" src="3.jpg" style="height:100px;">'); console.log('押されました'); hannmaa_dayo("panPinch","panPinchElm3"); });

これを
$(function () {の中に入れましょう
理由はスコープで検索してください

投稿2020/05/18 14:02

編集2020/05/18 19:21
hentaiman

総合スコア6426

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

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

Izumo1101

2020/05/18 16:18 編集

私も同様に考えて、document.getElementByIdではなくdocument.getElementByClassNameで拾おうとしたのですがいろいろ試してもエラーが克服できずあきらめました。
hentaiman

2020/05/18 19:30

本当のエラー内容に対する対処を追記しました 今回のように質問者が推測しているエラー原因と実際のエラー原因が異なる事もあると思うので、追記された部分を含めた文章(エラーを再現出来るだけの動くコードとエラーを載せた内容)で質問すると解決が早くまた正確な回答を得られる可能性が高まります
Izumo1101

2020/05/19 07:43 編集

ご指摘ご助言ありがとうございます。 あまりに冗長なコードに躊躇してしまいました。 恥ずかしながら $(function () {});が一つの関数という意識でいました。ですから関数から関数に引数を渡すのどうのと意味不明なことを言っていたと理解しました。スコープの意味も理解できました。渡せる範囲が決められているのですね。これを超えるためにグローバル変数だのどうのも今後の課題ですが、問題も解決でき理解も進みましたので感謝します。BAとさせてください。
hentaiman

2020/05/19 10:12

そうなると今度は「グローバルスコープ 汚染」や「クロージャ」で検索してみるとさらに理解が進むかもしれません 解決してよかったですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問