JavaScriptで変更した属性の元の値の取得方法と画像の変更後の元の画像に戻す方法

このQ&Aのポイント
  • JavaScriptでimg要素のsrc属性を変更することはできますが、変更後の値ではなく変更前の値を取得する方法はありません。img要素の変更前の値を取得するためには、変更前の値を別の属性に保存する必要があります。
  • 具体的には、img要素の変更後の値をdata属性に保存し、変更前の値を持つ別の属性にアクセスすることができます。例えば、img要素にdata-mimage属性を付けて変更後の値を保存し、元の値はsrc属性に保存します。
  • 変更後の値をdata-mimage属性に保存することで、JavaScriptでimg要素のsrc属性を変更するときにはdata-mimage属性の値を参照します。そして、元の値に戻す場合にはsrc属性に保存されている値を使います。これにより、HTMLを変更することなく元の値に戻すことができます。
回答を見る
  • ベストアンサー

JavaScriptで変更した属性の元の値の取得

いつもお世話になっております。 ページの画像をとある条件で変更しようとしております。 HTML5のdata-を利用して変更後の画像のパスをimg要素内に持たせております。 JavaScriptでimg要素を取得し画像の変更は実現できております。 その後もとの画像に戻したいのですが、JavaScriptでimg要素を取得してもsrc属性が変更後の値になっており変更前の値が取得できません。 変更前の値の取得方法を教えてください。 ■HTMLソースの一部 <p><img src="img/moto.gif" alt="" data-mimage="img/ato.gif"></p> ■JavaScriptの一部 function wid(){ var image=document.getElementsByTagName('img'); if(window.innerWidth>=320){ for(var i=0;i<image.length;i++){ image.item(i).src=image.item(i).getAttribute("data-mimage"); } }else{ // ここに元の画像に戻すためのスクリプトを書きたい } } } wid関数を作ってそのなかでimg要素を取得し、条件を満たしたらすべてのimg要素のdata-mimageの属性値を元のsrc属性に上書きします。 次に条件が満たされていない場合はHTMLにもともと書いてあったsrc属性の属性値をsrc属性値に戻したいのですがこの値が取得できません。 img/moto.gifをimg/ato.gifに変更することは出来ます。 img/ato.gifに変更した後img/moto.gifに戻すことが出来ません。 もちろんdata-mimage2="img/moto.gif"を追加すれば可能なのは分かっていますが、現状のHTMLを変更することなく実現したいです。 よろしくお願いします。

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

  • ベストアンサー
回答No.2

回答No.1のt_ohta様のおっしゃるとおり、 >書き換えてしまったものは取得できません。 ので、 >JavaScriptの変数に残しておくか、書き換える前にJavaScriptで別の属性を作って書き残しておきましょう。 の通り、別途属性を作ってパスを保持しておくのが良いかと思います。 _rakuda_ のサンプルを少し修正させてもらいまして、 下記のような形はいかがでしょうか・・・? function wid(){ var image=document.getElementsByTagName('img'); if( window.innerWidth>=320 ){ for(var i=0;i<image.length;i++){ // data-prev-imgがない場合、srcの値を data-prev-img に挿入する if (!image.item(i).getAttribute("data-prev-img")) { image.item(i).setAttribute('data-prev-img', image.item(i).getAttribute("src")); } image.item(i).src=image.item(i).getAttribute("data-mimage"); } } else { // ここに元の画像に戻すためのスクリプトを書きたい // data-prev-imgの値をsrcに挿入する image.item(i).src=image.item(i).getAttribute("data-prev-img"); } } 上記の形だと、関数実行時にしか data-prev-img が作られませんので、 data-prev-imgが無い状態で else のほうに入ってきてしまうとエラーが出てしまうので、 onload時などページの読み込みが終わったタイミングで、 data-prev-img の設定を先にしてしまうのが処理の流れ的には良いかもしれないですね。 ご参考になれば幸いです。

_rakuda_
質問者

お礼

複数の方から書き換え前の値は取れないとのご回答で心強いです。 ご回答ありがとうございます。 更にサンプルまでご提示ありがとうございます。 ほぼ同じもので希望の動作になりました。 いきなりelseのほうには言ってきたときの処理は変数flagを作ってifの処理の時にflag=1にして、elseをelse if(flag==1)で対応しました。 ありがとうございます。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5081/13277)
回答No.1

書き換えてしまったものは取得できません。 JavaScriptの変数に残しておくか、書き換える前にJavaScriptで別の属性を作って書き残しておきましょう。

_rakuda_
質問者

お礼

ご回答ありがとうございます。 for inで属性値をループさせたところ書き換え前の値が見当たらなかったので取れないのかなと思っていましたが、やはり無理だったのですね。 ありがとうございました。 書き換え前に別の属性値を作って残しておく方法にいたします。

関連するQ&A

  • jQuery:インデックス番号の属性を取得するには

    以下のようなHTMLで組まれている画像一覧があります。 <ul> <li><img src="sum_hoge.jpg"></li> <li><img src="sum_hoge2.jpg"></li> <li><img src="sum_hoge3.jpg"></li> </ul> jQueryを使って、各画像に拡大画像をリンクさせたいのですが 例) <li><img src="sum_hoge.jpg"></li> ↓ <li><a href="hoge.jpg"><img src="sum_hoge.jpg"></a></li> liはいくつ並ぶかわからず、hrefもimg srcから抽出してセットする必要があります。 (拡大画像は"sum_"が付かないだけで、同じファイル名です。) liの数の分だけfor文を回し、1行ずつsrcを抽出、sum_をとって<img>の前後に<a href=""></a>を付加していく・・・ということをやりたいのですが、 var j=$('ul li').length; for (var i = 0; i < j; i = i +1){ ? } でつまずいています。 インデックスで特定は $('li').eq(i) 属性の取得は $('img[src]') でできると思うのですが、 「特定のインデックス番号」の「特定の属性」を取得 ってどう書けばいいんでしょうか。 なんか回答を聞けば、あ、それでいいのか・・・と思うような気もしますが、どうぞよろしくお願いします。

  • JavaScriptで画像を変更する

    質問が分かりずらいと思いますが、お願いします。 <body>内に↓が書かれています。 <script language="JavaScript"> <!-- function ChangePics() { for(i = 0; i < 3; i++) document.images[i].src = "white.jpg"; } // --> </script> <img src="black.jpg"><br> <img src="black.jpg"><br> <img src="black.jpg"><br> <form> <input type="button" value="画像一括変更" onclick="ChangePics()"></input> </form> ------------------------------------------------------------ [画像一括変更]ボタンをクリックすると表示されていた3枚の「black.jpg」が「white.jpg」に切り替わります。 ですが、画像のsrcへのアクセスは「document.images[i].src」で 行っているため、 <img src="black.jpg"><br> <img src="black.jpg"><br> <img src="black.jpg"><br> の上に他の画像がある場合はその画像が「white.jpg」に変更されてしまいます。 ですが、<img src="black.jpg" name = "pic1">のようにname属性を付けるのは処理が面倒になるので、避けたいです。 質問の意図は、「作ったJavaScriptのプログラムをブログに載せたいが、そのプログラムの上にほかの画像があるため、正常に動作しない。」ということです。

  • ソースをメソッドPOSTで取得すると値に「”」が入ってしまう。

    <form action="test.php" method="post" >で<input type="text" />のなかに<img src="test.gif" />を入力してtest.phpで取得したデータをechoで書き出してみたら<img src=\"test.gif\" />と「\」が「"」の前に入ってしまって画像が表示されないのですが、どうしたらいいのかわからなくて困っています。どなたか教えてください。

    • 締切済み
    • PHP
  • HTMLタグから<IMG SRC="">のパス取得と書き換え

    ローカルにおいてある HTML ファイルを読み込ませて、<IMG SRC="sample.gif"> から sample.gif を取得します。 このsample.gifのMD5を取得し、たとえば MD5 が "abcd...xyz" であれば、 (ローカルの別フォルダ)/a/b/abcd...xyz.gif にコピーし、 元の参照を <IMG SRC="a/b/abcd...xyz.gif"> に変換するというスクリプトを書きたいと考えています。 HTML ファイルから sample.gif を取り出す方法、ファイルからMD5を取得する方法について教えていただけないでしょうか。 HTMLのパースなど調べたのですが、特定の属性を書き換える方法は 分かりませんでした。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • javascript正規表現がieでうまく動かない

    imgのsrc属性を汎用的に変更したいので 正規表現を使って変更したいと思っています。 現在のimg要素をを取得して(下記、変数名currentImg)、 imgのsrc属性を以下のように末尾に_newがついたものに 変更したいと考えています。 var newImg = currentImg.src.replace(/^(.+)(\.[a-z]+)$/g,"$1_new$2"); currentImg.src = newImg; 他のブラウザではうまく行くのですが、 ie8でうまく動きません。 ieの正規表現は、何か別の書き方をしないといけないものなのでしょうか? それとも、そもそも書き方が間違っているのでしょうか? 詳しい方がいらっしゃいましたら ご教授いただけると幸いです。 どうぞ宜しくお願いいたします。

  • NTML-Javascriptでのデータ受け渡し

    HTMLのプログラムでJavaScriptを外部処理にして以下のようにグラフィックデータを配列に入れ、一括で登録しHTML内でデータテーブルのオフセット値からデータを得ようとしましたがうまくいきません。 ページがロードされた時にデータを一括で読もうとしているのですが、デバッグのためにDocument.writeで処理の入り口と出口で文字を表示させましたが、入り口の方しか表示されず、処理が正しく行われていないようです。 どのようにすればうまくデータを得ることができますでしょうか? ----JavaScript---- var imgData = [ "img/01.gif", "img/02.gif", "img/03.gif", "img/04.gif", "img/05.gif", "img/06.gif", "img/07.gif", "img/08.gif", : : ] imgTbl = new Array(); for(var i=0; i<imgData.length-1; i++){ imgTbl[i] = new Image(); imgTbl[i].src = imgData[i]; } window.onload=function(){ ImageInit(imgData.length); } function ImageInit(no){ for(var i=0; i<no; i++){ document.write("IN..."+i+"<br>"); <--コチラは表示されます。 imageSetSrc(i); document.write("OUT..."+i+"<br>"); <--コチラは表示されません。 } } function imageSetSrc(i){ document.getElementById(i).setAttribute("src", imgData[i]); } ----------------------------------------------------- ----HTML---- : : <table border="0" cellspacing="0" cellpadding="0"> <tr> <td id=0 src="ImageSetSrc(0)" width="758" "80"></td> <--仮にデータのオフセットを0としています。 </tr> : : </table>

  • embed要素のsrc属性の値を変更するには

    JavaScriptを使って、embed要素のsrc属性の値を変更するにはどのようにすれば良いのでしょうか? 具体的には、 <embed src=aaa.swf name=swf></embed> 現在上記のようにswfファイルを埋め込んでいるのですが、 これを <embed src=bbb.swf name=swf></embed> に変更するボタンを作りたいと思っています。 <input onclick=document.swf.src="bbb.swf"> と書いて実行してみたのですが、動作しませんでした。 ご教示ください。よろしくお願い致します。

  • javascriptでMYSQLに接続したい

    下記のクリック時に画像を変更するjavascript内で、画像を変更するたびに現在の画像が何かをデータベースに値として格納したいのですがやり方が分かりません。 現在の画像がA.gifだったらデータベースに0を格納、B.gifだったら1を格納するといった仕様です。 どなたかご教授お願いできませんでしょうか? よろしくお願いします。 <script> function change(obj){ var orgimg="B.gif"; var newimg="A.gif"; var imgs=document.getElementsByTagName('img') for(var i=0;i<imgs.length;i++){ if(imgs[i].className==obj.className){ if(imgs[i]==obj) imgs[i].src=newimg; else imgs[i].src=orgimg; } } </script>

  • javascriptについて

    javascriptに関してまだまだ初心者で困っております. 作成したいプログラムは,画像をクリックすると,クリックした画像だけが"on.gif"になり,それ以外の画像は"off.gif"となるようなプログラムです. そこで以下のようなプログラムを作成したのですが,うまく動きません. ご助言頂ければ幸いです. <html> <head> <script type="text/javascript> <!-- function changeImg(no){ for (i=1; i<3; i++){ document.image[i].src = "off.gif"; if(i==no) document.image[i].src = "on.gif"; } } //--> </script> </head> <body> <ul> <li><a href="JavaScript:changeImg(1)"><img src="on.gif" name="image[1]" /></a></li> <li><a href="JavaScript:changeImg(2)"><img src="off.gif" name="image[2]" /></a></li> </ul> </body> </html>

  • ALT属性に見出しタグをつけると画像がズレます。

    見出しタグをHTMLで製作後、画像とALT属性に採用すると 画像がずれてしまいます。 <img src="images/img6.jpg" alt="●●●●●●●●●●●●" width="745" height="511"> を <h2><img src="images/img6.jpg" alt="●●●●●●●●●●●●" width="745" height="511"> </h2> 以下のコーディングにすると画像がずれます。 HTMLバージョンは、DTD HTML 4.01 Transitional となります。 CSSなどで画像の位置固定をするのではなく、そのままHTML内で完結したいと考えています。 どのように変えれば良いでしょうか また、alignタグなどは、HTML4.01非推奨で使えません。 バグで探したのですが見付かりませんでした。 よろしくお願いします。

    • ベストアンサー
    • HTML

専門家に質問してみよう