ハイライト表示をしたい

このQ&Aのポイント
  • ハイライト表示をしたいと思っています。最初に作った物はタグの中まで置換をしてしまい、HTMLがくずれるという問題が発生しました。
  • このサイトで質問したところ、以下のスクリプトを教えて頂きました。しかし、Firefoxでは動くのですが、IEでは動きません。
  • フレーム越しの要素コピーは、Firefoxではできて、IEではできないことが原因の可能性があります。javascript初心者ですが、解決方法を教えて頂けないでしょうか。
回答を見る
  • ベストアンサー

ハイライト表示をしたい

2度目の投稿(前回の投稿 http://oshiete1.goo.ne.jp/qa5506744.html)になりますが、指定の文言を色を変えて目立つように(以下ハイライト表示)させたいと思っています 最初に作った物はタグの中(altの中)まで置換をしてしまい、HTMLがくずれるという始末・・・ そこでこのサイトで質問した所、以下のスクリプトを教えて頂きました ところがfirefoxだと動くのですが、IE(IE6しか入っていない環境で使いたい)では動きません 色々調べたところ「フレーム越しの要素コピーは,FFではできて,IEではできないらしい」というのが原因じゃないかという所まで辿り着きました まだjavascript初心者で勉強中な為、教えて頂いたスクリプトも全部理解している訳ではありませんが、どなたか解決方法を教えて頂けないでしょうか 何卒宜しくお願い致します 以下教えて頂いたスクリプト <!-- var str; function left_load(){ if(str){ search(left.document.getElementsByTagName("body")); } } function search(elm){ for(var i=elm.length-1;i>=0;i--){ if(elm[i].nodeName=="#text"){ var re=new RegExp(str,"g"); var ss=elm[i].nodeValue; var result = elm[i].nodeValue.indexOf(str); if(result>=0){ var result_str=ss.replace(re,"<span style=\"background:#77ff77;font-weight:bold\">"+str+"</span>"); var newElement = document.createElement("span"); newElement.innerHTML = result_str; elm[i].parentNode.replaceChild(newElement,elm[i]); } }else{ if(elm[i].hasChildNodes()){ search(elm[i].childNodes); } } } } // --> </script>

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

ご提示のスクリプトがどこにあるのか不明ですが、多分、<frameset>のあるファイルにあるのかと想像します。 なぜそこにあって、グローバル変数(str)をどのように使っているのかよくわからないけど… >フレーム越しの要素コピーは,FFではできて,IEではできないらしい ↑というようなことはないでしょう。 documentは取得できているようですし。 どうやら、IEではテキストノードに対して、replaceChildとかinsertBeforeなどの操作が効かないみたい。(removeChildはできるみたいですけど。) とりあえず思いつくのは、search内では一度テキスト(目印になる文字列)に置き換えておいて、最後にまとめてinnerHTMLで置き換えるという2段階にすれば可能ではないのでしょうか。 ↓の例では一時置き換え用に「_ + ESC + DEL + _」の文字列を使っていますが、実際に利用するhtmlに出てこない文字列にしておくのがよろしいかと… (leftはフレームのname属性と仮定しました) function left_load(a){ if(str){ var e, str_tmp = '_\x1b\x7f_'; var str_rep = '<span style="background:#77ff77;font-weight:bold">' + str + '</span>'; e = frames['left'].document.getElementsByTagName("body"); search(e, str_tmp); e[0].innerHTML = e[0].innerHTML.replace(new RegExp(str_tmp,"g"), str_rep); } } function search(elm, s) { var i, e; for (i=elm.length-1; i>=0; i--) { e = elm[i]; if(e.nodeName=="#text") { e.nodeValue = e.nodeValue.replace(new RegExp(str,"g"), s); } else { if (e.hasChildNodes()) search(e.childNodes, s); } } }

zenigame99
質問者

お礼

ありがとうございました! 出来ました~!(>< 「IEではテキストノードに対して、replaceChildとかinsertBeforeなどの操作が効かない」←これが原因なのですね・・・ ブラウザによって動いたり動かなかったりと、javascriptって難しいですね 教えて頂いたスクリプトをきちんと理解出来るように勉強します 本当にありがとうございました

関連するQ&A

  • ハイライト表示が消えてしまう

    フレームを使って、右側のリンクリスト(right.html)をクリックした際に、左側に表示されたHTMLの文言をハイライト表示させたいと思っています ある程度は出来てきたのですが、一瞬ハイライトしてすぐに消えてしまうのです・・・ どなたかお助けして頂けませんでしょうか 宜しくお願い致します ~index.html~ <head> <meta content="text/html; charset=Shift-JIS" http-equiv="content-type"> <title>ハイライト表示</title> </head> <frameset cols="1031,*" frameborder="no" border="0" framespcing="0"> <frame src="#" scrolling="yes" id="left" name="left"> <frame src="right.html" scrolling="yes" id="right" name="right" noresize="noresize"> </frameset> <body> </body> </html> ~right.html~ <head> <meta content="text/html; charset=Shift-JIS" http-equiv="content-type"> <script language="javascript"> <!-- function change(str,url){ parent.left.location.href=url;  var re=new RegExp(str,"g"); var b=parent.left.document.body; var ss=b.innerHTML; b.innerHTML= ss.replace(re,"<span style=\"background:#77ff77;font-weight:bold\">"+str+"</span>"); } //--> </script> </head> <body> <ls><a href="#" onclick="change('建物','left_1.html')">left_1.html</a></ls> <ls><a href="#" onclick="change('建物','left_2.html')">left_2.html</a></ls> <ls><a href="#" onclick="change('建物','left_3.html')">left_3.html</a></ls> </body> </html> ちなみにleft_1.html等のリンク先のHTMLは修正する事が出来ません 何卒宜しくお願い致します

  • ハイライト表示(タグの中を除きたい)

    HTMLの特定文言をハイライト表示をする為に下記のような感じでjavascriptを組んだのですが、altの中身までreplaceしてしまい、altの中に文言があるとHTMLの形が崩れて画像も表示されなくなってしまいます これをなんとかしたいのですが、タグの中を置換しない方法はありますでしょうか もしくは下記の方法でなく「これならタグの中身を抜かしてハイライト出来る」という物はありませんでしょうか 何卒宜しくお願い致します ~現在の方法は以下~ 親(~index.html~) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "​http://www.w3.org/TR/html4/frameset.dtd">​ <html xmlns="​http://www.w3.org/1999/xhtml"​ lang="ja-JP"> <head> <title>ハイライト表示</title> <script type="text/javascript" charset="utf-8"> <!-- var str; function left_load(){ if(str){ var re=new RegExp(str,"g"); var b=left.document.body; var ss=b.innerHTML; b.innerHTML= ss.replace(re,"<span style=\"background:#77ff77;font-weight:bold\">"+str+"</span>"); } } // --> </script> </head> <frameset cols="1031,*" frameborder="no" border="0" framespcing="0"> <frame src="about:blank" onload="left_load();" scrolling="yes" id="left" name="left"> <frame src="right.html" scrolling="yes" id="right" name="right" noresize="noresize"> </frameset> </html> ~right.html~ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "​http://www.w3.org/TR/html4/frameset.dtd">​ <html xmlns="​http://www.w3.org/1999/xhtml"​ lang="ja-JP"> <head> <title>ハイライト表示選択</title> <script type="text/javascript" charset="utf-8"> <!-- function change(str,url){ parent.str = str; parent.left.location.href=url; } // --> </script> </head> <body> <ol> <li><a href="#" onclick="change('建物','left_1.html')">left_1.html</a></li> <li><a href="#" onclick="change('建物','left_2.html')">left_2.html</a></li> <li><a href="#" onclick="change('建物','left_3.html')">left_3.html</a></li> </ol> </body> </html>

  • 正規表現をまとめることってできますか?

    正規表現をまとめるにはどうしたらよいでしょうか? var str = document.forms[0].school_list.value; if (str == "") return; var result = ""; for (var i = 0; i < str.length; i++) result = str.replace(/,/g,'\n'); document.forms[0].result_school_list.value = result; document.forms[0].result_school_list.select(); var str = document.forms[0].result_school_list.value; if (str == "") return; var result = ""; for (var i = 0; i < str.length; i++) result = str.replace(/、/g,'\n'); document.forms[0].result_school_list.value = result; document.forms[0].result_school_list.select();

  • ビンゴマシン

    Java scriptとメモ帳使って作成したビンゴマシンを改良して、マシンのスタートとストップをEnterキーによる操作も出来るようにしたいと考えています。 しかしどうプログラミングしたらいいか分からず困っています。詳しい方ご教示よろしくお願い致します。 <style type="text/css"> body{ background-color: #fff; } #drum{ width: 450px; height: 450px; margin: 30px auto; position: relative; overflow: hidden; background-color: #fff; border: 2px solid #eee; border-color: #666 #eee #eee #666;} #drum span{ display: block; color: #000; font-size: 450px; height:450px; line-height: 450px; text-align: center; border-bottom: 2px groove #eee; position: relative;} div.result{ background-color: #fff; padding: 0.5em; position:relative; } #result{ width:100%; overflow:hidden; zoom:1; } #result span{ display:block; float:left; width:2.5em; text-align:center; color: #000; font-weight: bold;} #result span:last-child{ color: #f00; } </style></head> <body><div><div id="drum"></div></div> <hr><div> <input type="button" id="reset" value="reset"> <input type="button" id="switch" value="start/stop" or onClick="svset();"></div> <div class="result"> <div>◇◇ 結果 ◇◇</div> <div id="result"></div></div> <script type="text/javascript"> //********** rolling drum var DrumCreate = (function(){  var rand = function(n){ return Math.random() * n | 0; }  var shuffle = function(ary){    for(var i = ary.length - 1; i > 0; i--){     var j = rand(i + 1), tmp = ary[i];     ary[i] = ary[j], ary[j] = tmp;   } }  var add = function(elm, str, flag){   var e = document.createElement("span");   e.appendChild(document.createTextNode(str));   if(flag) elm.insertBefore(e, elm.firstChild)    else elm.appendChild(e); }  var clear = function(elm){   while(elm.firstChild) elm.removeChild(elm.firstChild); }  var init = function(obj){   if(obj.intervalId) clearInterval(obj.intervalId);   for(var i=obj.max; i; i--) obj.nums[i-1] = i;   shuffle(obj.nums);   obj.status = false;   obj.step = obj.height/(11 - obj.speed) + 0.5 | 0;   clear(obj.drum);   clear(obj.result);   add(obj.drum, "-", true); }  var setPos = function(elm, pos){   var nodes = elm.getElementsByTagName("span");   var i, node, p = -pos + "px";   for(i=0; node=nodes[i++];) node.style.top = p; }  var slide = function(obj){   var pos = obj.height, n = obj.nums.length;   if(!n){    clear(obj.drum);    add(obj.drum, "-");    obj.stop();    return;  }   obj.index = rand(n);   obj.value = obj.nums[obj.index];   add(obj.drum, obj.value, true);   setPos(obj.drum, pos);   obj.intervalId = setInterval(function(){    pos = pos>obj.step?pos-obj.step:0;    setPos(obj.drum, pos);    if(pos === 0){     clearInterval(obj.intervalId);     obj.drum.removeChild(obj.drum.lastChild);     if(obj.status) slide(obj)     else {      add(obj.result, obj.value);      obj.nums.splice(obj.index, 1);      if(typeof obj.endRoll === "function") obj.endRoll.call(obj);    }   }  }, 10); }  var drum = function(n){ this.nums = []; };  drum.prototype = {   roll: function(){    if(this.status) return;    this.status = true;    if(typeof this.beforeRoll === "function") this.beforeRoll();    slide(this);  },   stop: function(){ this.status = false; },   reset: function(){ init(this); },   beforeRoll: new Function(),   endRoll: new Function()  } return function(n , id1, id2, speed){  /* Max number, id for drum, id for result, speed(1to10) */   var obj = new drum();   obj.max = n;   obj.drum = document.getElementById(id1);   obj.result = document.getElementById(id2);   obj.height = obj.drum.clientHeight;   obj.speed = Math.max(1, Math.min(10, speed));   obj.reset();   return obj; }})(); //************ テスト用 スクリプト var testDrum = DrumCreate(75, "drum", "result", 5); /* Max number, id for drum, id for result, speed(1to10) */ addEvent("reset", "click", function(){testDrum.reset();}); addEvent("switch", "click", function(){  if(testDrum.status) testDrum.stop(); else testDrum.roll();}); /*@cc_on@*/ function addEvent(elm, eventname, func){ (typeof elm === "string"?document.getElementById(elm):elm)./*@if(1)attachEvent( 'on' + @else@*/addEventListener(/*@end@*/ eventname, func, false);}</script></body>

    • ベストアンサー
    • HTML
  • 10個の落ちてくる文字の位置を常に真中に表示

    お知恵をおかりしたいのですが、 下記のソースで10個の文字(GIF)がオンロードで落ちてくる という仕様なのですが、現在はポジションを指定してあるのですが、 これをスクリプトの追加で常に真中に揃えることがしたいのですが、 自分でもやってみましたがうまくいかずおわかりになる方お力をお貸しください。 <html> <head> <title></title> <script type="text/javascript"> window.onload = init; var n=8; var frac = [1.7,1.8,1.6,1.8,1.7,1.5,1.7,1.9]; var bound = [0.5,0.6,0.5,0.6,0.6,0.5,0.6,0.5]; var count = []; var elm=[]; var y = []; var handle=[]; function falling() { for(i=0;i<n;i++){ y[i] += ++count[i] * 0.001 * frac[i]; elm[i].style.top = y[i]; if(y[i] >= wH){ y[i] = wH; count[i] = Math.ceil(-count[i] * bound[i]); if( count[i] == -1 ) clearInterval( handle[i] ); } } } function init() { for(i=0;i<n;i++) { elm[i] = document.getElementById("sample"+i); handle[i] = setInterval(falling,10); y[i]=count[i]=0; } wH = document.all ? document.body.clientHeight : window.innerHeight; wH = wH - elm[0].height; } </script> </head> <body> <center> <img src=".jpg" width="330" height="440"> <img src=".gif" id="sample0" style="position:absolute;left:250px;"> <img src=".gif" id="sample1" style="position:absolute;left:300px;"> <img src=".gif" id="sample2" style="position:absolute;left:350px;"> <img src=".gif" id="sample3" style="position:absolute;left:400px;"> <img src=".gif" id="sample4" style="position:absolute;left:450px;"> <img src=".gif" id="sample5" style="position:absolute;left:500px;"> <img src=".gif" id="sample6" style="position:absolute;left:550px;"> <a href="#" alt="ENTER"><img src="enter.gif" id="sample7" border="0" style="position:absolute;left:680px;"></a> </center> </body> </html> というソースなのですが、たぶん1行か2行のコードの追加でモニタサイズなど関係なしに常にど真ん中にならべることができると思うのですが、難しく。。。。。 どうかなのとぞよろしくお願いいたします。

  • CSS3回転済み要素上のevent.x,yについて

    ■概要 IEのDXフィルターがIE10で廃止されたのをきっかけに、CSS3に手を出し始めました。 回転にはスタイルシートの属性値としてtransfar:rotate([number]deg)を用いますが、この回転を行った要素についておかしな点があったので質問させていただきます。 回転処理を行った要素上でマウスイベント(mousedown,move,up他)の座標メンバ(x,y)を取得すると、意味のわからない座標になっています。 規則性を見つけようとしましたが、効率の良い方法が見つからず悩んでいます。 やりたかったことは、回転済み要素をマウスでD&Dすることですが、マウスダウンの瞬間、座標がすっとんで、要素がワープします。 この現象の原因、仕組み、解決策等、ご回答よろしくお願い致します。m(_ _)m ■以下備考、随時補足させていただきます。 ・動作環境はIE10inWIN7、他は試していない。 ・rotate無しだと期待通りの動作。 ・ありだとたとえrotate(0deg)でもこの現象が起きる。 ■以下ソースコード:ローテートの行を消したりつけたりしてみてください。 <div id=asdf> aaa </div> <script> function SQUARE(){ this.posX = 0; this.posY = 100; } var elm; var square = new SQUARE(); function MainLoop(){ elm.style.left = square.posX; elm.style.top = square.posY; InputQWER(elm.style.left + ", " + elm.style.top); } function InputQWER(str){ var elm = document.getElementById("qwer"); elm.value = str; } function InputZXCV(str){ var elm = document.getElementById("zxcv"); elm.value = str; } function main(){ elm = document.getElementById("asdf"); elm.style.width = 100; elm.style.height = 100; elm.style.background = "yellow"; elm.style.position = "absolute"; //■■■■■■■■■■■■■■■■■■■■■■ ローテートの行 elm.style.msTransform = "rotate(30deg)"; elm.attachEvent("onmousemove", function(evt){ square.posX = evt.x; square.posY = evt.y; InputZXCV(evt.x + ", " + evt.y); }); timer = setInterval("MainLoop()", 100); } setTimeout("main()", 10); </script> <input id=qwer> <input id=zxcv>

  • 同時に複数重複する項目だけを絞り込ませたいです。

    3つの項目を絞り込む機能を実現したいです。 実現させたいことは、 チェックを1つ付けると、その項目だけしかないものを絞り込み、 チェックを2つ付けた場合は、その項目が両方あるものだけを絞りこみたいです。 現在は項目は3種類だけですが種類が増えても更新に負担がかからないようにしたい 試しましたが、チェックが2つ以上になると重複させて機能させることができませんでした。 アドバイスを頂けないでしょうか。 <html lang="ja"> <head> <script type="text/javascript"> function fff() { var elm = document.getElementById('test1'); var tag = document.getElementsByTagName('input'); var svalue1 = new Array(); var svalue2 = new Array(); var svalue3 = new Array(); var ccc; for(i=0, elmL=elm.children.length; i<elmL; i++){ var spanTAG = elm.children[i].getElementsByTagName('span'); svalue1[i] = new Array(); svalue2[i] = new Array(); svalue3[i] = new Array(); for(m=0, spanL=spanTAG.length; m<spanL; m++){ if(spanTAG[m].className == "span1"){ svalue1[i][m] = spanTAG[m].innerHTML; }else if(spanTAG[m].className == "span2"){ svalue2[i][m] = spanTAG[m].innerHTML; }else if(spanTAG[m].className == "span3"){ svalue3[i][m] = spanTAG[m].innerHTML; } if(tag[0].checked && !tag[1].checked && !tag[2].checked){num=1;}else if(tag[1].checked && !tag[0].checked && !tag[2].checked){num=2;}else if(tag[2].checked && !tag[0].checked && !tag[1].checked){num=3;}else if(tag[0].checked && tag[1].checked && !tag[2].checked){num=4;}else if(tag[0].checked && tag[2].checked && !tag[1].checked){num=5;}else if(tag[1].checked && tag[2].checked && !tag[0].checked){num=6;}else if(tag[0].checked && tag[1].checked && tag[2].checked){num=7;}else{num=8;} switch(num){ case 1: if(new RegExp(tag[0].value).test(svalue1[i][m]) && !new RegExp(tag[1].value).test(svalue2[i][m]) && !new RegExp(tag[2].value).test(svalue3[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 2: if(new RegExp(tag[1].value).test(svalue2[i][m]) && new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[0].value).test(svalue1[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 3: if(new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[1].value).test(svalue2[i][m]) && !new RegExp(tag[0].value).test(svalue1[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 4: if(new RegExp(tag[0].value).test(svalue1[i][m]) && new RegExp(tag[1].value).test(svalue2[i][m]) && !new RegExp(tag[2].value).test(svalue3[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 5: if(new RegExp(tag[0].value).test(svalue1[i][m]) && new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[1].value).test(svalue2[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 6: if(new RegExp(tag[1].value).test(svalue2[i][m]) && new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[0].value).test(svalue1[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 7: case 8: elm.children[i].style.display = 'block'; break; } } } } </script> </head> <body> <form action="#"> <ul> <li><input type="checkbox" name="c1" id="c1" value="aaa" onclick="fff()" /><label for="c1">aaa</label></li> <li><input type="checkbox" name="c2" id="c2" value="bbb" onclick="fff()" /><label for="c2">bbb</label></li> <li><input type="checkbox" name="c3" id="c3" value="ccc" onclick="fff()" /><label for="c3">ccc</label></li> </ul> </form> <div id="test1">  <div class="test2">   <span class="span3">ccc</span>   <span class="span2">bbb</span>   <span class="span1">aaa</span>   </div>  <div class="test2">   <span class="span3">ccc</span>   <span class="span1">aaa</span>  </div>  <div class="test2">   <span class="span2">bbb</span>   <span class="span1">aaa</span>  </div>  <div class="test2">   <span class="span3">ccc</span>  </div>  </body

  • クラスのcolor 「#ff0000;」を表示

    CSSのクラスsampleのcolor 「#ff0000;」を表示する方法を教えてください。 // cssの部分 .sample {    color: #ff0000; } // html内 JavaScriptの部分 <script type="text/javascript"> function () { var element = document.getElementById("sample"); var samplecolor = element.style.color; } </script> <span id="samplecolor"></span> //----------結果------------------- #ff0000;

  • Scriptを読み込み中の表示について

    HTML <script language="JavaScript" type="text/javascript" src="AAA.js"></script> 外部JS <!-- google.load("feeds", "1"); function initialize() { var feed = new google.feeds.Feed("RSSURL"); feed.setNumEntries(5); feed.load(function(result) { if (!result.error) { var container = document.getElementById("mini_feed"); for (var i = 0; i < result.feed.entries.length; i++) { var entry = result.feed.entries[i]; var div = document.createElement("div"); var entry = result.feed.entries[i]; var dd = new Date(entry.publishedDate); // now var yearNum = dd.getYear(); if (yearNum < 2000) yearNum += 1900; var date = yearNum + "年"+(dd.getMonth()+1)+"月"+dd.getDate()+"日"; container.innerHTML += "<div>【"+"<b>" + date+"</b>" +"】<br /><a href='" + entry.link + "'>" + entry.title + "</a></div>"; } } }); } google.setOnLoadCallback(initialize); //--> を設置し、RSSをスクリプトで表示しています。 2秒くらい読込みが遅いので、その部分が、一時空白状態のままになります。 そこで、読み込み中に読込みしていますというぐるぐる回る画像を表示したいのですが、どのように記述すれば宜しいのでしょうか?

  • select要素のvalueを配列で取得したいです

    select要素のvalueを配列で取得したく、下記のサンプルを動かそうと試みました。 <html> <head></head> <body> <form> <!-- ここに<select name="c1">~<select name="c20">の20個のselectがあるとする --> </form> <input type="button" value="はい" onclick="test(this.form)"> <script type="text/javascript"> function test ( form ) { var values = new Array(); for ( var i=0; i < 20; i ++ ) { var elm = form.elements['c'+i]; values[i] = elm.options[elm.selectedIndex].value; } } </script> </body> </html> このようなサンプルを動かそうとしたのですが、 var elm = form.elements['c'+i];のところの['c'+i]が正しくないようで 「elm is underfind」というエラーが出てしまいます <script> function myForm (form) { var values = new Array(); for ( var i=0; i<20; i++ ) { var elm = form.elements[i]; values[i] = elm.options[elm.selectedIndex].value; document.write(values[i] + "<br />"); } } </script> インデックス名を'c'+iからiにすると取得できるのですが、 ブラウザが読み込みをやめない状態になってしまいます。 select要素のnameはc1から始まりc20と何も換えていません。 何が間違っているのでしょうか。

専門家に質問してみよう