ツール開発講座 〜第7回 forループ〜 | 元溥帝のまったりブログ

元溥帝のまったりブログ

ブラウザ三国志 溥帝○○翼賛会の公式ブログのようです。

こんにちは。
最近反応がめっきり薄くなり、ブログランキングも落ち始めてしまって(´・ω・`)としているぷり☆けつです。

今日はループ処理(for文)というのをやっていきます。

ループっていうのは繰り返し処理のことなんですが、とりあえずどんなものか書いておきます。

for(最初に実行する処理; ループ内処理を実行する条件; ループ内処理が終わった後に実行する処理){
  ループ内処理
}

という書き方をします。

例を示します

for (var i=0; i<2; i++){
  console.log(i)
}

このfor文では最初に
var i=0
を実行します。(最初に実行する処理)

次に
i<2
であるか調べます。(ループ内処理を実行する条件)

現在iは0なのでi<2に一致しますね。一致したので
console.log(i)
でiの値をコンソールに出力します。0が出力されるはずです。

次にi++を行います。(ループ内処理が終わった後に実行する処理)
これは
i = i + 1
の略です。つまり
i = 0 + 1
が実行されました。
これで一周しました。

一周したら、もう一度ループ内処理を行うか検討します。(ループ内処理を実行する条件)
現在iは1になっています。
まだi<2の条件に当てはまります。
ループ内処理を行い、コンソールに1を出力しi++を行います。(ループ内処理が終わった後に実行する処理)

現在iは2になりました。
i<2ではありません(i==2です)。(ループ内処理を実行する条件)
ですので、ループ内処理は実行されず、ループは終了します。

難しかったら、
iが0から2になるまでi++していって、その間ループ内処理を行う
と覚えればOKです。


実際のツール作りの中で慣れて行きましょうか。

今まで散々やった同盟ランク1位の人の行のxpathは
".//*[@id='gray02Wrapper']/table[3]/tbody/tr[3]"
こんな感じでした。
2位の人のxpathは
".//*[@id='gray02Wrapper']/table[3]/tbody/tr[4]"
こんな感じ。
tr[3]のところの数字が3から4に変わりましたね。
順位を追っていくとここの数字が1ずつ増えていくのがわかると思います。

ここでforループです。
for (var i=3;i<700;i++){
  var xpath = ".//*[@id='gray02Wrapper']/table[3]/tbody/tr["+i+"]/td[2]/a"
}

ダブルクォーテーションの使い方に注意してください。
なんでこういう書き方するのかはとりあえずは分からなくても良いです。
自分でツール作る時は、iをダブルクォーテーションの中に入れない、という事に注意して書いてもらえれば大丈夫です。

iが3から700になるまでi++していって、その間
var xpath = ".//*[@id='gray02Wrapper']/table[3]/tbody/tr["+i+"]/td[2]/a"
を行います。

最大同盟員数から考えて、700まで行くことは有り得ませんので、十分全同盟で使えます。

前回までの知識を使って
var myName = "ぷり☆けつ"
for (var i=3;i<700;i++){
 var xpath = ".//*[@id='gray02Wrapper']/table[3]/tbody/tr["+i+"]/td[2]/a"
 var target = document.evaluate(xpath,document,null,9,null).singleNodeValue
 var userName = target.textContent
  
 if (myName == userName){
  var rowXpath = ".//*[@id='gray02Wrapper']/table[3]/tbody/tr["+i+"]"
  var row = document.evaluate(rowXpath,document,null,9,null).singleNodeValue
  row.style.backgroundColor = "yellow"
 }
}

こんな感じで書けば、自分の名前の行だけ黄色く出来そうです。
このコードが理解出来なかったら、前回までの復習をしてみてください。
「復習したけど、どうしても分からん」という場合はコメントいただければ、それに応じたもう少し詳しい解説をするように考えます。

さて、このコードでは確実に
var xpath = ".//*[@id='gray02Wrapper']/table[3]/tbody/tr["+i+"]/td[2]/a"
が実際には無い住所のxpathになる時が来てしまいますので、document.evaluate~をした時に迷子になってしまいます(エラーが出て止まってしまいます)。

そこでループ中断の処理が必要になります。
中断の命令は
break
と書きます。

自分の名前が見つかった段階で中断すればいいので
var myName = "ぷり☆けつ"
for (var i=3;i<700;i++){
 var xpath = ".//*[@id='gray02Wrapper']/table[3]/tbody/tr["+i+"]/td[2]/a"
 var target = document.evaluate(xpath,document,null,9,null).singleNodeValue
 var userName = target.textContent
  
 if (myName == userName){
  var rowXpath = ".//*[@id='gray02Wrapper']/table[3]/tbody/tr["+i+"]"
  var row = document.evaluate(rowXpath,document,null,9,null).singleNodeValue
  row.style.backgroundColor = "yellow"
  break
 }
}

なんか完成したっぽい感じになりましたね^^

このコードでは自分が所属していない同盟ではループを止められずにエラーが出てしまいますが
そもそも、他の同盟ページでは動かなくて良いツールなので、エラーが出ようが知ったこっちゃありませんw

でもちょっと気持ち悪いですよね^^;

次回、エラーが出ないように、最初に行数を数えてから必要なだけループを回すような方法を紹介します。

これから同盟の方で戦争があって忙しくなるので、しばらく更新頻度が落ちます。
一応あと2回分の原稿はできているのですが、すこしストックさせてください。
(1回分の原稿書くのに数時間かかるので、ストックが切れるとツライのです><)
だんだん難しくなって来ましたので、ちょうどいいタイミングだったかもしれません。


コメント欄を使って出来る限りのフォローはさせていただきますので
ツール作れるようになりたいと思っている方は、踏ん張ってついてきてください。