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

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

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

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1121閲覧

【html & jQuery】配列とstring型の比較ができない

shota-imoto

総合スコア37

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/20 14:31

#分からないこと
htmlの配列データに対してtextContentを用いて取得した値を、String型の配列と比較していますが、値が一致しているはずなのにtrueになってくれません。

分かりづらいと思うので例を示します

html

1<div class= content> 2 <a class= content__letter>a</a> 3</div> 4<div class= content> 5 <a class= content__letter>b</a> 6</div> 7<div class= content> 8 <a class= content__letter>1</a> 9</div> 10<div class= content> 11 <a class= content__letter>2</a> 12</div>

jQuery

1function comparison(letter){ 2 const array = ["a", "c", "1", "3"] 3 var result = "" 4 5 if (array.includes(letter)){ 6 result = letter 7 } 8 9 return result 10} 11function main_function(){ 12 var letter 13 $(".content__letter").each(function (i, element){ 14 letter = element.textContent 15 result = comparison(letter) 16 console.log(result) 17 } 18}

jQueryのmain_functionが呼び出された時の動作として、ブラウザのコンソールにすべてresult=""のまま表示がなされます。

これはfunctionのcomparison中のif文の条件が常にfalseとなっていることから発生しています・
letterの中には、arrayに含まれる"a"や"1"があるにも関わらず、すべてfalseとなるのは、なぜでしょうか?

#仮説と検証
##変数の型が一致していない?
$.type()にて変数letterとarrayの要素の一部の型を調べました。
どちらもstringとなっていました。

##実際に文字列と比較できる?

console.log(letter == "a") ```を記述しました。 結果、eachの繰り返し中すべてfalseでした。

console.log(letter == "1")

ただし

console.log(letter == 1)

string型となっていたのになぜ? 配列の値を数字に数字の比較はできそうです。 が、アルファベットの方も比較したいので原因はまだ追求する必要があります。 textContentで取得した値は何か特殊な型となるのでしょうか? もしくは、代替案ございましたら教えていただけると幸いです。 よろしくお願いいたします。 #その他 ##開発環境 - OS macOS Catalina (10.15.4) - VScode (1.45) ##言語・gemのバージョン - ruby 2.5.1p57 - rails (5.2.4.2) - haml (5.1.2) - haml-rails (2.0.1) - mysql2 (0.5.3) - sass (3.7.4) - sass-rails (5.1.0) - jquery-rails (4.4.0) ##ソースファイル

$(function () {
function chord_display_relative(letter) {
// 略
}

//これがeach文の中で呼び出される関数です
function chord_display_absolute(key, letter, last_letter) {

if (/#|b|m/.test(key)) { minor_flag = 1; key = key.replace("m", ""); } const absolute_note_other_array = [ "Ab", "A#", "B#", "Cb", "D#", "E#", "Fb", "Gb", ]; var key_index = absolute_note_other_array.indexOf(key); if (key_index == 0) { key = "G#"; } else if (key_index == 1) { key = "Bb"; } else if (key_index == 2) { key = "C"; } else if (key_index == 3) { key = "B"; } else if (key_index == 4) { key = "Eb"; } else if (key_index == 5) { key = "F"; } else if (key_index == 6) { key = "E"; } else if (key_index == 7) { key = "F#"; } const absolute_note_array = [ "G", "G#", "A", "Bb", "B", "C", "C#", "D", "Eb", "E", "F", "F#", "G", "G#", "A", "Bb", "B", "C", "C#", "D", "Eb", "E", "F", "F#", ]; key_index = absolute_note_array.indexOf(key);

  //const以下で定義されている配列が例のコードのarrayにあたります。
const relative_note_array1 = ["1", "2", "3"];
const relative_note_array2 = ["4", "5", "6", "7"];

var changed_index; const symbol_should_not_changed = ["|", "m", "{", "}", "@", "$", "t"]; const half_note_array = ["B", "b"]; var previous_index; var previous_note; var delete_flag = 0; changed_index = 0;

  
// 問題のif文
if (symbol_should_not_changed.includes(letter)) {
} else if (relative_note_array1.includes(letter)) {
changed_index = key_index + (letter * 2 - 2);
letter = absolute_note_array[changed_index];
} else if (relative_note_array2.includes(letter)) {
changed_index = key_index + (letter * 2 - 3);
letter = absolute_note_array[changed_index];
} else if (half_note_array.includes(letter)) {
previous_index = absolute_note_array.indexOf(last_letter);
delete_flag = 1;
if (letter == "B") previous_index = previous_index + 1;
if (letter == "b") previous_index = previous_index - 1;
if (previous_index == -1) {
previous_index = absolute_note_array.length - 1;
letter = absolute_note_array[previous_index];
}
} else {
letter = "";
}

var output = new Object(); output.letter = letter; output.delete_flag = delete_flag; return output;

}

//問題のメイン関数
function chord_display(key) {
var chord_text = $(".chord-display--text").text();

$(".chord_text__chord_letter").each(function (i, element) { var letter = $(".chord_text__chord_letter")[i].textContent; var last_letter; if (i == 0) { last_letter = ""; } else if (i > 0) { last_letter = $(".chord_text__chord_letter")[i - 1]; } var letter = element; letter = letter.textContent; console.log(letter); var output; if ( $(".key__key-display--relative-key").attr("style") == "display: flex;" ) { output = chord_display_relative(letter); } else if ( $(".key__key-display--relative-key").attr("style") == "display: none;" ) { output = chord_display_absolute(key, letter, last_letter); } else { output = chord_display_absolute(key, letter, last_letter); } $(".chord_text__chord_letter")[i].textContent = output.letter; });

}

続きは以下。ここから下で発火していますが、今回は余り関係がありません。 ```rails function absolute_key(note_selected, key_now_state) { const symbols = ["#", "b"]; if (symbols.includes(note_selected)) { if (/#|b|m/.test(key_now_state)) { key_now_state = key_now_state.slice(0, 8); } $(".key__key-display--now").text(key_now_state + note_selected); } else if (note_selected == "m") { if (/m/.test(key_now_state)) { } else { $(".key__key-display--now").text(key_now_state + note_selected); } } else { $(".key__key-display--now").text("key of " + note_selected); } } $(".key__key-display").on("touchend mouseup", function () { $(".chord-menu__key--palettes").show(); }); // 発火点 $(".palettes__palette").on("touchend mouseup", function () { var note_selected = $.trim($(this).text()); var key_now_state = $(".key__key-display--now").text(); key_now_state = $.trim(key_now_state); if (note_selected == "閉じる") { $(".chord-menu__key--palettes").removeAttr("style"); } else { if (note_selected == "移動ド") { $(".key__key-display--relative-key").css("display", "flex"); key_for_registration("relative-key"); } else { $(".key__key-display--relative-key").hide(); absolute_key(note_selected, key_now_state); key_now_state = $(".key__key-display--now").text(); key_for_registration(key_now_state); } chord_display(key_now_state); } }); // 発火点2 // ページ読み込み時の挙動 $(document).ready(function () { var key_now_state = $(".key__key-display--now").text(); key_now_state = $.trim(key_now_state); // absolute_key(note_selected, key_now_state); chord_display(key_now_state); key_for_registration(key_now_state); }); function key_for_registration(key_now_state) { if ($("#key_name").get(0) != undefined) { $("#key_name").val(key_now_state); } } });

haml

1.content__chord 2 - @song.chords.each do |chord| 3 - chord_array = chord.text.split(//) 4 .chord_text 5 - chord_array.each do |char| 6 %a.font_base.chord_text__chord_letter{value: char} 7 =char

↓変換後

html

1<!-- each文で表示される例。 --> 2<div class="chord_text"> 3 <a class="font_base chord_text__chord_letter" value="1">1</a> 4 <a class="font_base chord_text__chord_letter" value="#">#</a> 5 <a class="font_base chord_text__chord_letter" value="3">3</a> 6 <a class="font_base chord_text__chord_letter" value="b">b</a> 7</div>

他に必要な情報があれば教えて下さい。

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

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

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

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

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

shota-imoto

2020/05/20 14:47

テストありがとうございます。 明日、もう一度元のソースを確認します。 今回、ターゲットと思っていたところと別のところに問題がありそうですね。 また、今回は説明ように簡単なモデルを作成しましたが、実際にテストするのも、問題解決に役立ちそうですね。勉強になります。
shota-imoto

2020/05/20 23:51

textContentを行った段階で謎のスペースが生じていました。 具体的には a class="font_base chord_text__chord_letter" value="1">1</a> のときは取得値は"1 " trim()でカットしたらtrueが返ってくるようになりました。 html上はスペースなどなかったので、なぜ紛れ込んだのかは謎です。 ご対応ありがとうございました♪
shota-imoto

2020/05/20 23:53

取得値、再度確認したら " 1 " と改行が入っていました。
kei344

2020/05/21 00:00

どのように解決したのかを回答文に書き、「解決済」にされてはいかがでしょうか。
guest

回答1

0

自己解決

textContentを行った段階で謎のスペースが生じていました。
具体的には
a class="font_base chord_text__chord_letter" value="1">1</a>
のときは取得値は" (改行)1 "
trim()でカットしたらtrueが返ってくるようになりました。
html上はスペースなどなかったので、なぜ紛れ込んだのかは謎です。

簡易のコードを作って動作を確かめていただいたところスペースは発生せず動作しました。

投稿2020/05/22 23:56

shota-imoto

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問