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

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

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

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

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Q&A

解決済

3回答

484閲覧

classListからの操作でなぜアイコンが変わるのか

Mori-Yukito

総合スコア24

JavaScript

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

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

0グッド

1クリップ

投稿2018/07/06 08:37

編集2018/07/06 15:24

前提・実現したいこと

少しわからないことがあり質問しました。
JavaScriptのclassListの仕様が知りたいです。

ボタンをクリックすると
like(1)実行前
<ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class="ons-icon ons-icon--ion ion-ios-heart-outline">
like(1)実行後
<ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class="ons-icon ons-icon--ion ion-ios-heart like">
のように変化していました。

そこで、ion-iconはclassから指定できるのかなと思い、
<ons-icon class="ons-icon ons-icon--ion ion-ios-heart-outline">
としてみるも何も表示されませんでした。

なぜlike(1)でアイコンは変わるのでしょうか?

該当のソースコード

JavaScript

1function like (num) { 2 if (document.getElementByID("button-post-like-"+num).classList.contains("like")) { 3 document.getElementById("button-post-like-"+num).classList.remove("ion-ios-heart", "like"); 4 document.getElementById("button-post-like-"+num).classList.add("ion-ios-heart-outline"); 5 } else { 6 document.getElementById("button-post-like-"+num).classList.remove("ion-ios-heart-outline"); 7 document.getElementById("button-post-like-"+num).classList.add("ion-ios-heart","like"); 8 }; 9};

HTML

1<ons-button modifier="quiet" onclick="like(1)"> 2 <ons-icon id="button-post-like-1" icon="ion-ios-heart-outline"></ons-icon> 3</ons-button> 4 5<style type="text/css"> 6 .like { 7 color: red; 8 } 9</style>

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

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

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

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

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

mather

2018/07/06 08:52

like関数が文法エラーを起こすので、動いてるコードをコピーして貼り付けてください。
guest

回答3

0

ベストアンサー

結論

classListの仕様ではなくWeb Componentsで実現しているからでした。(ソウイエバカイテアッタナー)

Monacaのアーキテクチャー

先進的なアーキテクチャー

先進的なアーキテクチャー
Onsen UIの中身は3つのレイヤーで作られています。
CSSコンポーネント: 次世代のCSSであるcssnextで実装されています。
Web Components: JavaScriptで記述されており、どんなフレームワークともお使いいただけます。

Web Componentsについては以下くらいしか理解してません。(想像大いに入っている)
0. 独自のタグをjavascriptでclassで作成可能
0. 通常のタグと同じく、属性値を変えたら即反映(なんかうまいこと(^^;)してlistenしているんでしょうな。slim.jsなのかな?

結論に至った経緯

属性変更を検知するのってMutationObserverくらいしか知らなくて、onsenui.jsを調べたけど見つからず…
下のコードで調べた時に5.icon指定無しならの動作がどうしてもしっくりこない。タグ名で検索したら何だこのソースは?→そうか、これがWeb Componentsか→あーicon属性なかったら動きそうにないなぁ ってところまで確認しました。
var icon = (略)'<ons-icon icon="' + `this.getAttribute('icon')` + '"></ons-icon>');

JS

1 <p>1.フォトシェアアプリのコード</p> 2<p>アイコン指定に関してはiconのほうが優先</p> 3<ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class="ons-icon ion-ios-heart-outline ons-icon--ion"></ons-icon> 4<ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class="ons-icon ons-icon--ion ion-ios-heart like"></ons-icon> 5 </div> 6 <div> 7 <p>2.iconだけにしたら?</p> 8 <p>表示する</p> 9<ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class=""></ons-icon> 10<ons-icon id="button-post-like-1" icon="ion-ios-heart" class=""></ons-icon> 11 </div> 12 <div> 13 <p>3.classでstyleを追加 </p> 14 <p>色は変わるけどアイコンは変わらない</p> 15<ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class="ons-icon ons-icon--ion ion-ios-heart like"></ons-icon> 16<ons-icon id="button-post-like-1" icon="ion-ios-heart" class="ons-icon ion-ios-heart-outline ons-icon--ion"></ons-icon> 17 </div> 18 <div> 19 <p>4 .classを手動で変更 </p> 20 <p>色は変わるけどアイコンは変わらない</p> 21 <ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class="ons-icon ion-ios-heart-outline ons-icon--ion"></ons-icon> 22<ons-icon id="button-post-like-1" icon="ion-ios-heart-outline" class="ons-icon ons-icon--ion ion-ios-heart like"></ons-icon> 23 </div> 24 <p>5.icon指定無しなら</p> 25<p>表示しない。。。なんで?</p> 26<ons-icon id="button-post-like-1" class="ons-icon ion-ios-heart-outline ons-icon--ion"></ons-icon> 27<ons-icon id="button-post-like-1" class="ons-icon ons-icon--ion ion-ios-heart like"></ons-icon> 28 </div> 29<!-- // onsenui.js 12280 30// _createClass(ActionSheetButtonElement, [{ 31// var icon = _util2.default.createElement('<ons-icon icon="' + this.getAttribute('icon') + '"></ons-icon>'); 32--> 33

投稿2018/07/07 16:56

編集2018/07/08 02:23
oikashinoa

総合スコア2826

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

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

Mori-Yukito

2018/07/13 12:39

ありがとうございました!
guest

0

js

1document.getElementByID("button-post-like-"+num).classList("like")) {

ではなく

js

1document.getElementByID("button-post-like-"+num).classList.contains("like")

ではないでしょうか?

element.classList


…ふと思ったんですが、monacaで作っているならchromeのデバッガーで追ってないのかな?

投稿2018/07/06 14:11

編集2018/07/06 14:14
oikashinoa

総合スコア2826

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

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

Mori-Yukito

2018/07/06 15:28

ご指摘の通りです。すみませんでした。 デバッガーで追う(一応onclickの前後のons-iconの変化は見ました)と、前述の通りclassの中身が変化していて、でもそれが原因でiconが変わったとも言い切れず、分からないので質問しました。
oikashinoa

2018/07/06 15:33

like()以外で書き換わっているとか?ソース全体が無いのでよく分かりません。 like()にブレークポイント置いてステップ実行で見ていけばすぐ解ると思いますよ。
Mori-Yukito

2018/07/06 15:57 編集

なるほど。 試してみます。 追記: このコード自体は、monacaの「フォトシェアアプリ デザインテンプレート」の一部です。すべて載せると大変なコード量になるので、お手数ですがすべてのコードについてはそちらを参考にして頂けると有り難いです。
Mori-Yukito

2018/07/07 04:44

ステップ実行とやら試してみましたがよく分かりませんでした(どこがどう置き換わったかは分かるのですが、なぜそこが置き換わってアイコンが変わるのかが分かりません)。 仕方ないのでonsenuiのons-icon.jsを理解しようとしましたが、難しくてよく分かりませんでした。 御多忙とは思いますが、oikashinoaさんの方でons-icon.jsをみていただけないでしょうか?無理を言ってすみません。 ons-icon.jsのmonacaでのディレクトリは www/lib/onsenui/esm/elements/ons-icon.js です。 どうかよろしくお願いします。
oikashinoa

2018/07/07 08:11

2018/07/07 00:57 に対して書いたことです …参考にしたものとかは書いてくださいね。(患者が電話で「お腹が痛いんで診察して下さい。でも体見せるの恥ずかしいから電話でおねがいします」って言われている医者ようなもんです) ion-iconってなんでしょ?「フォトシェアアプリ デザインテンプレート」でコード見たんですがどこにもみあたらず。 --- そこで、ion-iconはclassから指定できるのかなと思い、 <ons-icon class="ons-icon ons-icon--ion ion-ios-heart-outline"> ---
Mori-Yukito

2018/07/07 08:24

すみません。"one-iconのicon"の誤りです。 参考にした箇所は当該テンプレートの like関数: index.html 73~86行目 ボタン及びアイコン: index.html 157行目 です。 お手数おかけしてすみません。
guest

0

https://ja.onsen.io/v1/reference/ons-icon.html

こちらを見る限り、質問の内容では省略されている icon="..." の部分が重要なようです。
質問をするときには自分の気になっている部分だけではなくそのまま記載してください。

投稿2018/07/06 09:04

mather

総合スコア6753

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

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

Mori-Yukito

2018/07/06 09:32

申し訳ないです。 icon="~"の中身ですが、htmlのコードとまったく同じものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問