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

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

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

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

jQuery

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

Q&A

解決済

2回答

889閲覧

jQuery: テキストの内容によって、データ属性に値(複数)を追加したい

vankick

総合スコア22

JavaScript

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

jQuery

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

0グッド

2クリップ

投稿2019/11/21 04:25

編集2019/11/21 05:05

テキストの内容によって、データ属性に値(複数)を追加したいです。

追加する場所は、data-filterです。
デフォルトで、 #a-1, #b-1 という値が入っており、ここにさらに、下記のような条件にて値を追加したいです。
(サービスと要望は毎回、各1こずつ追加されます。なので、常に下記のような形になります。)

<div class="list col" data-filter='["#a-1", "#b-1"]'>
赤くしたい という文字列が含まれている場合は、"#a-2"を追加 丈夫にしたい という文字列が含まれている場合は、"#a-3"を追加 塗装 という文字列が含まれている場合は、"#b-2"を追加 建築 という文字列が含まれている場合は、"#b-3"を追加

現在、

console.log($('.list.col').data('filter'));

の値を見てみると、
確かに #a-数字 のフォーマットでdata-filter が形成されてはいるようです。

しかし、上記の作り出した data-filter は、実際に現在のhtmlにある data-filter に追加されません。

試みたことでは、

$('.list.col').data('filter', '#a-' + index_number);

と書けば、data-filter に値をセットできると思ったのですが、
追加されていませんでした。

どのようにすれば、作り出した data-filter の値を追加することが出来るでしょうか。

<!-- html --> <div id="js-casestudy"> <div class="list col" data-filter='["#a-1", "#b-1"]'> <div class="entry"> <div class="attribute"> <dl> <dt>サービス</dt> <dd class="case_service">塗装</dd> </dl> <dl> <dt>要望</dt> <dd class="case_request">赤くしたい</dd> </dl> </div> </div> </div> <div class="list col" data-filter='["#a-1", "#b-1"]'> <div class="entry"> <div class="attribute"> <dl> <dt>サービス</dt> <dd class="case_service">建築</dd> </dl> <dl> <dt>要望</dt> <dd class="case_request">丈夫にしたい</dd> </dl> </div> </div> </div> </div>
// jQuery $(function() { $('#js-casestudy .list').each(function(){ var request_list = ['赤くしたい', '丈夫にしたい', '転居したい']; var request = $('.attribute dl dd.case_request').text(); var service_list = ['塗装', '建築', '引っ越し', '清掃']; var service = $('.attribute dl dd.case_service').text(); var req = request_list.length; var serv = service_list.length; while (req--) { if (request.indexOf(request_list[req]) !== -1) { var index_number = (request_list).indexOf(request_list[req]) + 2; $('.list.col').data('filter', '#a-' + index_number); console.log($('.list.col').data('filter')); } } while (serv--) { if (service.indexOf(service_list[serv]) !== -1) { var index_number = (service_list).indexOf(service_list[serv]) + 2; $('.list.col').data('filter', '#b-' + index_number); console.log($('.list.col').data('filter')); } } }) });

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

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

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

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

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

x_x

2019/11/21 04:52

#a-2 ですか? 提示のコードでは最終的に "#b-2" となるのではないでしょうか?
vankick

2019/11/21 05:03

最終的には、 1つ目の .list は、 <div class="list col" data-filter='["#a-1", "#a-2", "#b-1", "#b-2"]'> 2つ目の .list は、 <div class="list col" data-filter='["#a-1", "#a-3", "#b-1", "#b-3"]'> となるはずでした。
guest

回答2

0

ベストアンサー

jQuery の .data() は独自にデータを持つことになるので、インスペクタから見たいのであれば .attr() にします。
https://api.jquery.com/data/#data1

Using the data() method to update data does not affect attributes in the DOM. To set a data-* attribute value, use attr.

.list が複数あるので不必要なところを変更しないように注意

jQuery

1 //var request = $('.attribute dl dd.case_request').text(); 2 var request = $('.attribute dl dd.case_request', this).text();

service も同様。

JavaScript

1 //$('.list.col').data('filter', '#a-' + index_number); 2 var filter = JSON.parse($(this).attr('data-filter') || '[]'); 3 filter.push('#a-' + index_number); 4 $(this).attr('data-filter', JSON.stringify(filter));

投稿2019/11/21 09:39

x_x

総合スコア13749

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

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

vankick

2019/11/21 15:07

ありがとうございます、思っていた通りの動きになりました。魔法のようです。 頂いたコメントをよく読んでみます。 ありがとうございました!
guest

0

data-filter の値を追加

jQueryの解釈の問題ですね
カスタムデータ内のjson配列を配列として変換してくれる仕様のようです
配列なのでpushすれば追加できます

javascript

1<script> 2$(function(){ 3 $('.list.col').data('filter').push("#c-2"); 4 $('.list.col').data('filter').push("#b-1"); 5 console.log($('.list.col').data('filter')); 6}); 7</script> 8<div class="list col" data-filter='["#a-1","#b-1"]'></div>

しかし、setと違ってclassのようにユニークな処理はしてくれませんので注意

生のjsでやるならJSON.parse/JSON.strigifyを駆使してください

調整版

javascript

1<script> 2$.fn.dataAdd=function(x,y){ 3 if(typeof $(this).data(x)== "undefined"){ 4 $(this).data(x,y); 5 }else if(typeof $(this).data(x)== "string"){ 6 $(this).data(x,[$(this).data(x),y]); 7 }else{ 8 $(this).data(x).push(y); 9 } 10} 11$.fn.dataDel=function(x,y){ 12 if(typeof y== "undefined"){ 13 $(this).removeData(x); 14 } 15 if(typeof $(this).data(x)== "string" && $(this).data(x)==y){ 16 $(this).removeData(x); 17 } 18 if($(this).data(x) instanceof Array){ 19 $(this).data(x,$(this).data(x).filter(z=>z!==y)); 20 if($(this).data(x).length==0) $(this).removeData(x); 21 } 22} 23$(function(){ 24 console.log($('.list.col').data('filter')); 25 $('.list.col').dataAdd('filter','#a-1'); 26 console.log($('.list.col').data('filter')); 27 $('.list.col').dataAdd('filter','#b-1'); 28 console.log($('.list.col').data('filter')); 29 $('.list.col').dataDel('filter','#b-1'); 30 console.log($('.list.col').data('filter')); 31 $('.list.col').dataDel('filter','#a-1'); 32 console.log($('.list.col').data('filter')); 33}); 34</script> 35<div class="list col"></div>

投稿2019/11/21 04:58

編集2019/11/21 05:50
yambejp

総合スコア114839

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

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

vankick

2019/11/21 05:10

ありがとうございます。 ですが、console.log($.type($('.list.col').data('filter'))) をすると、stringと判定されていました。 $('.list.col').data('filter').push('#a-' + index_number); と書くと、 $(...).data(...).push is not a function というエラーも出てしまいました。
yambejp

2019/11/21 05:50 編集

当初1個しかなければ元が文字列なので追加するには 適当なキャスト処理が必要でしょう (調整版追記しておきました、del処理も追記してあります)
vankick

2019/11/21 15:08

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問