javaScript初心者です。
firefox3.5を使っています。
最近、プログラムを組んでいたのですが
絶対パスや相対パスをあまり意識しないでプログラムを書いていました。
プログラム中では
document.getElementById(a).src = "画像.jpg";
のように代入していたのですが
ふと絶対パスや相対パスはどうなっているのだろうと不安になり
alert(document.getElementById(a).src);
のようにalertで表示させてみると絶対パスが入っていることがわかりました。
インターネットで検索してみたところIEでは
どうやらバグとして認知されているようなのですが
(参考:http://css-bug.jp/win/ie/ver6_under/0043/)、
FireFoxでも同じようなことがあるのですか?
中で変換されているのでしょうか?
どういった仕組みになっているのか教えてください。
そして相対パスと比較を行うときにはどのように比較することができるでしょうか。
いまはファイルの文字数がはっきりしているのでfor文の中で
document.getElementById(i).src.slice(-9) == file + i + ".jpg"
のように行っていますが、もっとよい方法がありますか?
初歩的な質問かもしれませんがよろしくお願いします。
No.1ベストアンサー
- 回答日時:
ご提示の参考サイトの記事は
element.getAttribute("src")だと、通常のブラウザはソース上の属性値
(もとの値により相対パスだったり絶対パスだったりする)が取得できるの
だけれど、IEだと常に絶対パスが返されてしまう。
という意味ではないでしょうか?
逆に言えば、.多くの場合、getAttribute()で相対パスを取得することが可能です。
>もっとよい方法がありますか?
似たようなものですが、正規表現で最後の「/」(又は先頭)からURIの終わりまでを比較してあげるとか…
(ご提示のように文字数を限定しなくてもよくなる)
ちゃんとやるなら、「最後まで」ではなく、クエリやハッシュの部分を除くようにしておく方がよいでしょう。
また、そのようになってくると、正規表現で処理するのが適切になってくるのではないでしょうか?
No.4
- 回答日時:
僭越ながら No.2 に補足させて頂くと、img 要素(HTMLImageElement オブジェクト)の src プロパティが絶対 URI であるかは DOM Level 2 HTML 仕様書に記述されていません。
しかし仕様書の正誤表で「絶対 URI を返す」と追記されました(→参考 URL)。ご質問にある「バグ」はそれとは別です。DOM Level 3 Core 仕様書によれば、img.getAttribute('src') は指定値、つまり相対 URI をそのまま返すはずです。しかし、IE5-7 ではまるで img.src と同じように勝手に絶対 URI に直してしまいます。このことは No.1 でも指摘済みですね。
DOM Level 3 Core 仕様書は一般的な XML 処理のためのもの(HTML も含む)、DOM Level 2 HTML 仕様書は HTML 4.01/XHTML 1.0 処理に特化したものです。現在、これらは HTML ブラウザ用に再整理され、
・HTML Standard 仕様書(別名 HTML5)には、値が URI であるプロパティ値は絶対 URI に直されると明記されました(2.8.1 節。絶対 URI に直すアルゴリズムも同仕様書 2.6.3 節に書かれています)。
・DOM Core 仕様書(旧名 Web DOM Core)には、getAttribute() の戻り値は生成時の値であると明記されました(5.6、5.6.1 節)。
長々と書きましたが、要するに img.getAttribute('src') はもとが相対 URI ならそのままを、img.src は必ず絶対 URI に直した形を返すことで合意されています。そうでなければブラウザの不具合ですので、バグ報告して下さい。
---
URI の仕様である RFC 3986 には、URI を分解するための正規表現例が掲載されています。
var URIPattern = /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
var uri = 'http://example.org/pub/hoge/photo1.png?date=2011 …
var components = URIPattern.exec(uri);
components[0]; // オリジナル URI
components[1]; // "http:"
components[2]; // "http"
components[3]; // "//ecxample.org"
components[4]; // "example.org"
components[5]; // "/pub/hoge/photo1.png"
components[6]; // "?date=2011/06/05"
components[7]; // "date=2011/06/05"
components[8]; // "#xywh=30,30,100,100"
components[9]; // "xywh=30,30,100,100"
これを使えば、仮に画像 URI の後ろに余計なものがついていたとしても、パス成分 components[5] だけを操作できます。パス成分の 0 文字目が "/" なら絶対パスです。また、components[1] が存在するなら絶対 URI です。
これを使うほどではないかもしれませんが、覚えておいて損はないと思います。
参考URL:http://www.w3.org/2000/11/DOM-Level-2-errata
No.3
- 回答日時:
>FireFoxでも同じようなことがあるのですか?
>中で変換されているのでしょうか?
>どういった仕組みになっているのか教えてください。
どういう仕組みかはわかりません。
ソースコードを読んだり、IEならMicrosoft関係者ならソースコードを読めるかもしれませんが、でなければ逆アセンブルなどで解析すればわかると思いますが。
ブラウザごとに属性値が違うのはよくありますね。
backgroundColorを色名で指定しても、backgroundColorを取得しなおすとrgb(0,0,0)だったりとか、#000000だったりとか、
けっこうめちゃくちゃです。
仕様かバグかはわかりません。
・W3C定義のDOMと異なった仕様の元で動いている仕様通りの動きなのか、
・W3C定義のDOMと同じ仕様の元で動いているが、その仕様と違う動き(バグ)なのか、
・W3C定義のDOMと同じ仕様にしてブラウザの仕様を作ったつもりが、仕様書が間違えていた、しかしブラウザは制作された仕様書通りに作った(仕様書のバグ)なのか、
仕様かバグかというのは、制作者自身しかわからないと思うのですが。
特にIEはJScriptというJavaScriptと似て非なる言語で動いています。
(JavaScript自体、派生が多すぎて混沌としてると思いますけどね。
JScript、Firefox用JavaScript(JavaScript1.7やE4X)、標準JavaScript(ECMAScript)、Safari用、Opera用、Chrome用、、、)
>そして相対パスと比較を行うときにはどのように比較することができるでしょうか。
絶対パスは必ず/から始まります。
相対パスは必ず/以外の文字から始まります。
絶対URLは://が入っています。
ファイル名を取得するときの別案として。
var a=src.split('/');
alert(a[a.length-1]);
var a=src.match(/\/(.*)$/);
alert(a);
画像のsrcは、"/"で終わることはないと思うので、/\/(.+)$/の方がいいかもしれません。
よくわかりませんが、HTML5の規定をHTML4やXHTMLに適用してはダメなのでは?
No.2
- 回答日時:
IE8- の getAttribute() のバグについては下記URLにまとめたので参考にしてください。
このバグはIE9 で修正されているはず。http://vird2002.s8.xrea.com/javascript/getAttrib …
IE8 では element.getAttribute('src', 2); で期待通りの結果、つまり「属性値」が返されます。
http://msdn.microsoft.com/en-us/library/ms536429 …
一方、element.src は絶対URIを返す仕様です。IE8- でなくても絶対URIを返します。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-re …
IE7- には getAttribute でプロパティを参照するというバグがありますので、IE7- をサポートするなら getAttribute は使わない方がいいです。
srcプロパティは絶対URIであるという前提の元に element.src を利用するのが無難だと思います。
element.src = 'hoge.jpg';
のように相対URIを代入することは問題ありません。ブラウザは自動的に絶対URIに変換します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(プログラミング・Web制作) pythonでDepixを起動 5 2022/12/18 08:04
- Visual Basic(VBA) VBSで作成した相対パスのショートカットが他者と共有できません。 1 2022/09/05 11:20
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- その他(IT・Webサービス) 301リダイレクトの使い方について 7 2022/04/05 17:50
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- HTML・CSS Dreamweaver のテンプレートでの相対パスの設定について 2 2023/06/13 17:28
- その他(コンピューター・テクノロジー) <a href="file:///フォルダ名/ファイル名">リンクテキスト</a>について 1 2023/04/06 22:40
- Visual Basic(VBA) batにて、異なるフォルダの同名ファイルを参照し、文字列を判別。擬似配列で変数へ格納 3 2022/04/10 03:37
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OpenCV での画素値の比較について
-
色の変更
-
リンク先を動的に変更する
-
libjpegライブラリの使い方につ...
-
画像が表示でnull; this.src
-
指定したフォルダの画像を一括...
-
MAX関数を使ってからLEFT JOIN...
-
スタイルシートで画面を上下に...
-
JavaScript スライドの画像にリ...
-
textareaに画像を表示したい
-
アコーディオンメニューの開閉制御
-
javascriptでスタイルを動的に...
-
キャラクターがぴょこんと飛び...
-
HTMLで条件分岐はできますか?
-
Ctrl+F(検索)の窓を出したいの...
-
javascriptで、クリックしたら...
-
c++std::string型をTCHARに変換...
-
URL末尾に特定の文字を含む場合...
-
【jQuery】複数の画像の読み込...
-
eclipseでcssを使うためには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptで変更した属性の元...
-
MFCで画像を表示させているので...
-
画像が表示でnull; this.src
-
error LNK2019 未解決のシンボ...
-
(javascript)HTMLで指定した...
-
外部javascriptの重複を防ぐには
-
libjpegライブラリの使い方につ...
-
Vb.net2005での画像の合成方法
-
外部ファイルにしたら文字化け...
-
jQuery 複数のfind()
-
HTMLからimgのsrcのみを正規表...
-
html内にスライドショーを複数設置
-
条件分岐でキーが入力されてい...
-
複数画像のランダム複数表示(...
-
ダイアログから画像ファイルは...
-
【OpenCV】二値画像後、白の部...
-
"lightbox"の"CLOSE"ボタンクリ...
-
onclickで画面が固まる・・・ら...
-
pythonで、tkinterとpillowの組...
-
imgボタンにfocusの当て方
おすすめ情報