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

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

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

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

Q&A

解決済

2回答

3930閲覧

JSで指定した文字を指定した画像に置き換えたいです。

ByronHasegawa

総合スコア255

JavaScript

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

0グッド

2クリップ

投稿2015/01/15 01:49

指定した文字を指定した画像に置き換えたいです。

例: 「人」という文字があるところは「img/people.jpg」の画像に置換されるようにしたい。

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

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

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

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

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

guest

回答2

0

Yousuckさんの方法は内部的にinnerHTMLを利用している(と予想される)やり方で、
処理負荷が高く、JavaScriptのイベント等が削除されてしまい問題です。

以下のコードは、長いですが負荷も小さく、問題になりにくいコードとなります。

lang

1/** 2 * 特定の要素の子孫要素にあたるテキストノードの全てに対して処理を行う 3 * @see http://stackoverflow.com/questions/2579666/getelementsbytagname-equivalent-for-textnodes#answer-2579869 4 * 5 * @param {Node} target 子孫要素を取得する要素 6 * @param {function(Node)} callback コールバック関数。第一引数には見つかったテキストノードが渡される 7 */ 8var forTextNodes = function (target, callback) { 9 var callback_run = function (textNodes, callback) { 10 for (var i = textNodes.length; i--;) { 11 var text_node = textNodes[i]; 12 var parent = text_node.parentNode; 13 var parent_tagName = parent.tagName.toLowerCase(); 14 if (!( 15 parent.nodeType === 1 && 16 ( 17 parent_tagName === 'textarea' || 18 parent_tagName === 'template' 19 ) 20 )) { 21 callback(text_node); 22 } 23 } 24 }; 25 26 if (document.createTreeWalker && window.NodeFilter && ('SHOW_TEXT' in NodeFilter)) { 27 var SHOW_TEXT = NodeFilter.SHOW_TEXT; 28 29 try { 30 document.createTreeWalker(document.body, SHOW_TEXT, null, false); 31 32 /** 33 * TreeWalker 34 */ 35 (forTextNodes = function (target, callback) { 36 var textNodes = []; 37 var walker = document.createTreeWalker(target, SHOW_TEXT, null, false); 38 39 var node; 40 while (node = walker.nextNode()) { 41 textNodes[textNodes.length] = node; 42 } 43 44 callback_run(textNodes, callback); 45 })(target, callback); 46 47 return; 48 } catch (e) { } 49 } 50 51 /** 52 * Iterative Tree Traversal 53 */ 54 (forTextNodes = function (target, callback) { 55 var textNodes = []; 56 57 var node = target.firstChild; 58 while (node) { 59 if (node.nodeType === 3) { 60 textNodes[textNodes.length] = node; 61 } 62 63 if (node.hasChildNodes()) { 64 node = node.firstChild; 65 } else { 66 while (!node.nextSibling && node !== target) { 67 node = node.parentNode; 68 } 69 node = node.nextSibling; 70 } 71 } 72 73 callback_run(textNodes, callback); 74 })(target, callback); 75}; 76 77/** 78 * 文字列を別の文字列、あるいはDOM要素に置換する 79 * 80 * @param {string} search_str 置換元の文字列 81 * @param {string|Node|NodeList|Array.<Node>} replace 置換する文字列、DOM要素、DOM NodeListオブジェクト、あるいはDOM要素で構成された配列 82 */ 83function replaceTextNode(search_str, replace) { 84 if (replace.cloneNode) { 85 /* Node */ 86 replace = [replace]; 87 } else { 88 if (!( 89 (typeof replace.length === 'number' && replace.item) || 90 Object.prototype.toString.call(replace) === '[object Array]' 91 )) { 92 /* string */ 93 replace = [document.createTextNode('' + replace)]; 94 } 95 } 96 97 forTextNodes(document.body, function (text_node) { 98 var text = text_node.nodeValue; 99 if (text.indexOf(search_str) !== -1) { 100 var parent = text_node.parentNode; 101 102 var text_list = text.split(search_str); 103 for (var i = text_list.length; i--;) { 104 var t = text_list[i]; 105 106 if ((i + 1) in text_list) { 107 for (var j = replace.length; j-- ;) { 108 parent.insertBefore( 109 replace[j].cloneNode(false), 110 text_node.nextSibling 111 ); 112 } 113 } 114 115 if (t !== '') { 116 parent.insertBefore( 117 document.createTextNode(t), 118 text_node.nextSibling 119 ); 120 } 121 } 122 123 parent.removeChild(text_node); 124 } 125 }); 126} 127 128/** 129 * HTML文字列からDOM要素を生成する 130 * 131 * @param {string} html_str HTML文字列 132 * @return {NodeList} 生成したDOM要素を含むNodeListオブジェクト 133 */ 134var stringToDomNodeList = function (html_str) { 135 var p = document.createElement('div'); 136 137 if (p.insertAdjacentHTML) { 138 try { 139 p.insertAdjacentHTML('afterbegin', 'x'); 140 141 return (stringToDomNodeList = function (html_str) { 142 var p_ = p.cloneNode(false); 143 p_.insertAdjacentHTML('afterbegin', html_str); 144 return p_.childNodes; 145 })(html_str); 146 } catch (e) { } 147 } 148 149 return (stringToDomNodeList = function (html_str) { 150 var p_ = p.cloneNode(false); 151 p_.innerHTML = html_str; 152 return p_.childNodes; 153 })(html_str); 154}; 155 156/* ***** */ 157 158/** 159 * 「人」を画像に置換する 160 * 置換先の画像は文字列ではなくHTMLなので、 161 * stringToDomNodeList関数で変換する 162 */ 163replaceTextNode( 164 '人', 165 stringToDomNodeList('<img src="img/people.jpg">') 166); 167 168// 画像にしか置換しないなら、以下のようにDOM要素を生成する方法のほうが良い 169/* 170var replace_node = document.createElement('img'); 171replace_node.src = 'img/people.jpg'; 172 173replaceTextNode( 174 '人', 175 replace_node 176); 177*/

jQueryなどにも依存していないので、単体で利用できます。

ただし、jQueryのようにhead要素(headタグ)内に配置すると動作しないかも知れません。
onloadの後に実行するようにするか、body要素(bodyタグ)内の一番下に配置した方が良いでしょう。
jQueryと併用するなら、$(function(){ … });内に配置しても構いません。

参考: javascript - getElementsByTagName() equivalent for textNodes - Stack Overflow

投稿2015/01/15 09:59

sounisi5011

総合スコア697

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

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

0

ベストアンサー

jQuery使ってますが、いかがでしょうか

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script> (function($){ $(function(){ var bodyText = $("body").html(); var img = '<img src="img/people.jpg">'; $("body").html(bodyText.replace(/人/g,img)); }); })(jQuery); </script>

投稿2015/01/15 08:30

Yousuck

総合スコア349

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

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

ByronHasegawa

2015/01/15 08:32

ありがとうございます!!! できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問