HTMLとCSSの挿入
HTMLの挿入 replaceHTML()
HTML文字列をまとめて挿入し、挿入したHTMLをDOM操作したい時の関数です。
前準備として、HTMLを挿入したい箇所に次のダミータグを記述します。(複数対応)
<script class="APPNAME"></script>
このダミータグが指定したHTMLに置換されます。(タグ名はscript以外も可)
クラス名で検索するので、replaceHTML()関数の第二引数にはクラス名を入れてください。
var html = function(){/*
ここにHTML文字列を記述する
*/}.toString().match(/\n([\s\S]*)\n/)[1];
replaceHTML(html, "APPNAME");
function replaceHTML(html, className){
var option = [];
var dummy = document.querySelectorAll("." + className);
for(var i = dummy.length-1; i >= 0; i--){
dummy[i].attr = {};
for(var j = 0; j < dummy[i].attributes.length; j++){
if(dummy[i].attributes.item(j).nodeValue) {
var attrname = dummy[i].attributes.item(j).nodeName.replace(/^data-/i, "");
dummy[i].attr[attrname] = dummy[i].attributes.item(j).nodeValue;
}
}
dummy[i].attr.id = className + i;
option.unshift(dummy[i].attr);
dummy[i].insertAdjacentHTML('afterend', html);
dummy[i].nextSibling.id = className + i;
dummy[i].parentNode.removeChild(dummy[i]);
}
return option;
}
新規に挿入されたHTMLにはid属性が自動付与されます →「APPNAME+0から始まる数字」 (APPNAMEは変更可)
戻り値は配列で、各要素には元タグの全属性+idがオブジェクトの形で入っています。要素数は置換した数です。
上記の例だと、配列の0番目に {"class":"APPNAME", "id":"APPNAME0"} が入ります
これはHTMLからJavaScriptにデータを渡したいときに利用できます
var option = replaceHTML(html, "APPNAME");
for(var i = 0; i < option.length; i++){
var dom = document.getElementById(option[i].id);
//これで挿入したHTMLのDOM操作ができる
}
属性名が「data-」から始まっている場合は、名前の「data-」部分はカットします。(data属性)
HTMLの挿入 insertHTML()
ダミータグを使用せずHTMLを挿入する関数
- 第1引数: HTML文字列
- 第2引数: 挿入したい場所のDOM要素
- 第3引数: 関係。"兄", "弟", "長男", "末っ子"のうちいずれか1つ
例えば、HTML文字列を「#where」の「長男」として挿入したい場合は次のようになります
insertHTML(html, document.getElementById("where"), "長男");
var html = function(){/*
ここにHTML文字列を記述する
*/}.toString().match(/\n([\s\S]*)\n/)[1];
function insertHTML(html, where, relation){
var dummy = document.createElement("div");
dummy.innerHTML = html;
var dom = dummy.children;
var num = dummy.children.length;
var result = [];
if(relation == "兄"){
for(var i = 0; i < num; i++){
result.push(where.parentNode.insertBefore(dom[0], where));
}
}
else if(relation == "弟"){
for(var i = num-1; i >= 0; i--){
result.unshift(where.parentNode.insertBefore(dom[i], where.nextSibling));
}
}
else if(relation == "長男"){
for(var i = num-1; i >= 0; i--){
result.unshift(where.insertBefore(dom[i], where.firstChild));
}
}
else{ //末っ子
for(var i = 0; i < num; i++){
result.push(where.appendChild(dom[0]));
}
}
return result;
}
戻り値は配列です。各要素には挿入したDOMが入っています
CSSの挿入 insertCSS()
cssをheadタグの一番後ろに挿入します
var css = function(){/*
ここにCSS文字列を記述する
*/}.toString().match(/\n([\s\S]*)\n/)[1];
insertCSS(css);
function insertCSS(css){
var style = document.createElement("style");
style.innerHTML = css;
document.head.appendChild(style);
}