以前、以下の記事を公開しました。
公開当初から1年以上経った現在もカスタマイズ方法について質問をいただきます。今回は、以下のような内容でコメントをいただきました。
例えば、↓のような具合のことを行いたいです。
<a title=”URL” href=”URL” rel=”nofollow”>タイトル</a>
抜粋日時(サイト1)– 中略 –
具体的に教えていただきたいです!
個別記事にしていただけますと嬉しいです!!メリークリスマス!!!
クリスマスですし、よい機会なのでサンプルコードと解説などを書きました。
htmlコードの出力を決めているのはこの部分です
まず、以下のJavascriptコードをご参考ください。過去公開した記事中にあるサンプルコードから「htmlコードを出力させている個所のみ」抜粋しています。
for (var j = 0; j < feedsArr.length; j++) { var aE = document.createElement("A"); var h3 = document.createElement("H3"); var p = document.createElement("P"); var spanD = document.createElement("SPAN"); aE.href=aE.title=feedsArr[j][1]; aE.appendChild(document.createTextNode(feedsArr[j][4])); h3.appendChild(aE); spanD.appendChild(document.createTextNode(feedsArr[j][2])); spanD.appendChild(document.createTextNode(" ("+feedsArr[j][5]+")")); p.appendChild(document.createTextNode(feedsArr[j][3])); p.appendChild(spanD); container.appendChild(h3); container.appendChild(p); var img_link = document.createElement("img"); img_link.setAttribute("src", feedsArr[j][6] ); img_link.setAttribute("width", "100" ); //幅:width属性に100pxを指定 container.appendChild(img_link); //img(画像)タグを出力 }
上のコードを好きにいじくると、思い通りのhtmlコードを出力できます。
ご要望通りに書き換えると、こうなります
以下のコードがサンプルです。
for (var j = 0; j < feedsArr.length; j++) { var aE = document.createElement("a"); //「a」要素を作成 aE.setAttribute("href", feedsArr[j][1] ); //「href」属性に取得したURLを設定 aE.setAttribute("title", feedsArr[j][1] ); //「title」属性に取得したURLを指定 aE.setAttribute("rel", "nofollow" ); //「rel」属性に「nofollow」を指定 aE.appendChild(document.createTextNode(feedsArr[j][4])); //記事タイトルを「a」要素の内部に作成 container.appendChild(aE); //「a」要素の内容をコンテナ「<div id="feed">~</div>」の内部に作成 container.appendChild(document.createTextNode(feedsArr[j][3] + feedsArr[j][2] + " (" + feedsArr[j][5] + ")")); //抜粋日時(ブログタイトル名)の形式でコンテナ「<div id="feed">~</div>」の内部に作成 }
上記のコードに差し替えると、今回いただいたご要望の通りに出力できます。
「何をやっているのか」理解すると応用もできる
コード内でどんな処理がされているのか、仕組みを理解するといろいろと今後に役立つ場面も出てくると思います。もし興味をお持ちでしたら、一例として以下をご参考ください。
「document.createElement()」で「要素」を作成
すごく簡潔に書きます。
まずは、リンクタグ「<a>」を作成して記事タイトルを設定する必要があります。ですので、はじめに「a」※要素を作成します。(※エレメントとも言います。 以下、「要素」で統一)
「a」要素を作成したい場合
変数は任意で指定します。「a」の要素(エレメント:Element)だから「aE」みたいな。そんな要領で覚えやすいほうがいいでしょうかね。お好みでつけます。
var aE = document.createElement("a");
「p」要素を作成したい場合
別の要素を作成したい。例えば「p」要素を作成したい場合は、以下のようにします。変数名とカッコ「()」内の値を変更するだけです。
var pE = document.createElement("p");
補足解説
要素を新しく追加する場合は、上記の例にならって作成すればいいですね。とても単純にできます。
作成した要素に属性「rel」や値「nofollow」などを付与する
次は、作成した「a」要素に対して「href」「title」「rel」の属性と、値を設定します。以下の例を参考ください。
aE.setAttribute("href", feedsArr[j][1] ); //「href」属性に取得したURLを設定 aE.setAttribute("title", feedsArr[j][1] ); //「title」属性に取得したURLを指定 aE.setAttribute("rel", "nofollow" ); //「rel」属性に「nofollow」を指定
補足解説
「aE.setAttribute」で「a」要素に対して属性と、値を指定します。「feedsArr[j][1]」はGoogle Feed APIで取得したURLの値が入っています。
「appendChild()」で要素を指定する
以下の例は、「a」要素をコンテナ「<div id=”feed”>~</div>」の内部に作成する場合です。
aE.appendChild(document.createTextNode(feedsArr[j][4])); //記事タイトルを「a」要素の内部に作成 container.appendChild(aE); //「a」要素の内容をコンテナ「<div id="feed">~</div>」の内部に作成 container.appendChild(document.createTextNode(feedsArr[j][3] + feedsArr[j][2] + " (" + feedsArr[j][5] + ")")); //抜粋日時(ブログタイトル名)の形式でコンテナ「<div id="feed">~</div>」の内部に作成
補足解説
「document.createTextNode()」でテキストを作成しています。Google Feed APIで取得した値と、変数「aE」の内容を作成します。ここで、作成場所を指定するのに「appendChild()」を使っています。上記のコードでは、container「<div id=”feed”>~</div>」内に作成しています。おそらく、この辺の理解が慣れるのに時間がかかる場合もあると思います。ですが、やっていることは単純です。「どの場所に作成するか」というだけなので「document.createTextNode()」「appendChild()」を理解して、使ってみましょう~。
まとめ
Google Feed APIで取得した値を例にしましたが、使いどころはいろいろとあります。特に、今回登場した「createElement」「setAttribute」「createTextNode」「appendChild」それぞれは、とてもシンプルな仕組みです。今回はその仕組みを組み合わせているだけに過ぎないので、意味さえ理解できれば何とでも、どうとでもできるようになります。
参考リンクの解説もご参考ください
- document.createElement – Web API リファレンス | MDN
- element.setAttribute – Web API リファレンス | MDN
- document.createTextNode – Web API リファレンス | MDN
- Node.appendChild – Web API リファレンス | MDN
私も最初は全然できませんでした。なので、これから勉強される方は、何かのご参考となりましたら幸いです!
Imamuraさん
あらためまして、
記事化していただき、ありがとうございます!!!!!
また、基本の部分の説明をいただき、とてもありがたくおもいます!!!
私にとってはとても大きなクリスマスプレゼントです!ありがとうございますっ!!!!
解説部分を読みまして、
いままで、チンプンカンプンだった世界だったのが、
構造が見えてきて、感動です♪
コピペの世界から、応用の世界へ!という具合で、とても嬉しいです!!
こんなに丁寧に説明いただいたからには、
頑張るぜよ!と
imamuraさんの解説を参考に、
参考リンクや色々と検索しつつ、本日朝から格闘していたのですが、
でっ、でっ、できません・・・(泣)
「それぞれのエントリーをdivで括る」にはどうしたらよいか、
ほんとうに、大変ずうずうしいお願いなのですが、
教えていただければなと思います。
それから、class指定はすること可能なのでしょうか?
ハッピーメリークリスマス!!!
ステキなクリスマスを♪
2013/12/25 12:09:44
ツイート
シェア
そうですか~。そしたら、divでくくるには一例ですけど「divE」を新しく作成して、「appendChild」を使えばできます~。以下のコードでできると思います。
for (var j = 0; j < feedsArr.length; j++) {
var divE = document.createElement("div"); //括る「div」を作る
var aE = document.createElement("a");
aE.setAttribute("href", feedsArr[j][1] ); //「href」属性に取得したURLを設定
aE.setAttribute("title", feedsArr[j][1] ); //「title」属性に取得したURLを指定
aE.setAttribute("rel", "nofollow" ); //「rel」属性に「nofollow」を指定
aE.appendChild(document.createTextNode(feedsArr[j][4])); //記事タイトルを作成
container.appendChild(divE); //「div」を作成
divE.appendChild(aE); //「div」の中に「a」を作成
divE.appendChild(document.createTextNode(feedsArr[j][3] + feedsArr[j][2] + " (" + feedsArr[j][5] + ")")); //「div」の中に抜粋日時(ブログタイトル名)の形式で作成
}
class指定をする場合は、「setAttribute」を使えばクラス指定できます。頑張ってみてください~!
2013/12/30 15:46:57
ツイート
シェア
Imamura先生っ!!!
あけまして、おめでとうございます!
う、うぉーーーーーー!ありがとうございますっ!!!
で、で、でっ、出来ましたーーーーーーーー!!!!!!(感涙)
感謝してもしきれません!!!
Javascript人生のはじまりです♪
心より感謝もうしあげます!!!
Imamuraさんのとって、今年もすてきな1年でありますように。
ありがとうございました!
2014/01/04 14:21:50
ツイート
シェア
あけましておめでとうございます~。
無事にできてよかったですね!僕も勉強になりました。また遊びに来てください!
2014/01/06 15:26:53
ツイート
シェア