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); }