• ベストアンサー

リンク元URLの必要な部分だけを表示するには

javascriptを用いて、リンク元のURLを取得して必要な部分だけ切り出し、テキストボックスに表示するにはどのように記述したらいいのでしょうか。 自サイト内であるページでリンクの貼ってあるボタンを押した時に、リンク先のフォームにどのディレクトリから来たか値を入れたいのです。 リンク元のURLが http://aaa.jp/bbb/ccc/123/ddd.html だったとき リンク先のフォームの中のテキストボックスに ccc/123 だけを自動で入力するような方法を教えて下さい。 よろしくお願いします。

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

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

chromeはセキュリティの関係上パスがローカルで読めないことがある ディレクトリを跨いでも基本的に同じサーバー内ならcookieは読めるはず ……てなところでcookieの日付設定をし忘れてたorz document.cookie = "ref=" + location.href; ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //COOKIE有効期限(単位:日) var limitDay = 1; var nowTime = new DategetTime(); var createTime = new Date(nowtime + (60 * 60 * 24 * 1000 * limitDay)); var expires = createTime.toGMTString(); //name=値; expires=有効期限の日付; document.cookie = "ref=" + location.href + "; expires=" + expires;

kajiya16
質問者

お礼

ありがとうございます。 修正してみたところ、IE7~9とfirefoxで動作するようになりました。 しかしchromeだけundefinedとなってしまいます。 chromeのセキュリティにも対応する方法はありますでしょうか?

kajiya16
質問者

補足

リンク元ページに下記javascript //COOKIE有効期限(単位:日) var limitDay = 1; var nowTime = new DategetTime(); var createTime = new Date(nowtime + (60 * 60 * 24 * 1000 * limitDay)); var expires = createTime.toGMTString(); //name=値; expires=有効期限の日付; document.cookie = "ref=" + location.href + "; expires=" + expires; リンク先ページに下記javascript <script type="text/javascript"> <!-- function cookieRead(target){ var cookie_memory = ""; var read_cookie = document.cookie.split("; "); for(var i=0;i<read_cookie.length;i++){ var cookie_split = read_cookie[i].split("="); if(cookie_split[0] == target){ cookie_memory = cookie_split[1]; break; } } return cookie_memory; } function extract(){ backURL = cookieRead("ref");//document.referrer; backDIR = backURL.split("/"); document.getElementById("ref").value = backDIR[4] + "/" + backDIR[5]; } //--> </script> そしてリンク先ページに下記htmlタグ <body onload="extract()"> <input type="text" id="ref" value="">

その他の回答 (5)

回答No.6

×パスが読めない ○Cookieが読めない ローカルファイルやローカルでのクッキーがおかしくなるのは仕様ですが デバッグしたい時やレジストリ弄れる人なら方法は幾つか…… ・起動オプションに「--enable-file-cookies」を追加 ・ホストを立てる ・レジストリを弄る ローカルでの運用にChromeは鬼門です。 あまりオススメはしません (ローカルファイルにアクセスできなかったりなんやかんや)

kajiya16
質問者

お礼

ありがとうございます。 IEで悩むことはあってもchromeで悩むことがあるとは思ってませんでした…。 今回本当にありがたい勉強をさせて頂きました。 ありがとうございます。 回答No.5までの内容を、後から閲覧する人のために補足にまとめてベストアンサーとさせて頂きます。 ありがとうございました。

回答No.4

http://ux.getuploader.com/file_is_mine/download/5/testProg.zip http://ux.getuploader.com/file_is_mine/download/6/NewWindow.PNG IE7~9でテストしましたが此方では正常に動いています。 セキュリティでスクリプトをブロックされていませんか? テストしているIEのバージョンは幾つでしょう? 念のためコードを含めてすべてお渡しします。

参考URL:
http://ux.getuploader.com/file_is_mine/download/5/testProg.zip
kajiya16
質問者

お礼

コードまるごとありがとうございます。 頂いたサンプルを使って色々やってみたところ やっと原因というか状況というかがわかりました。 とりあえず試したこととその結果を補足に書きます。

kajiya16
質問者

補足

まずこちらの環境ですが、IEは9で、他にfirefoxとchromeで試しています。 またIEはブラウザモード7~9でそれぞれ試しています。 各ブラウザで全てのスクリプトを実行にしています。 色々試してみたことは以下のようになります。 IE:e firefox:f chrome:c 頂いたサンプルのリンク元:a.html 頂いたサンプルのリンク先:b.html もともと実行したいファイルのリンク元:A.html もともと実行したいファイルのリンク先:B.html とします。 1)頂いたサンプルをローカルで実行  e:OK f:OK c:error(undefined)←これはなぜだかわかりません 2)頂いたサンプルをサーバーで実行  e:OK f:OK c:OK 3)A.htmlとB.htmlにa.htmlとb.htmlのソースを丸ごと上書きして実行  e:error f:error c:error 4)A.htmlからb.htmlへリンクして実行   e:error f:error c:error 5)a.htmlからB.htmlへリンクして実行   e:error f:error c:error ここであれ?と思いまして… 6)A.htmlとB.htmlを同じディレクトリに入れて実行  e:OK f:OK c:OK となりました。 同じディレクトリじゃないとundefinedになってしまうようです。 相対パスだとよくないのかと思い絶対パスにしてみたりしましたが関係なくundefinedでした。 ディレクトリをまたいでいるとcookieを読めなくなったりするのでしょうか?

回答No.3

IEはリファラ取得できない場合があって FlashのgetURL()か javascriptのlocation.href ……で遷移した場合は取得に失敗する場合がある JSで遷移してる? なら遷移直前に document.cookie = "ref=" + location.href; って書いて……クッキーに現在のURLを保存してから 遷移後は <script type="text/javascript"> <!-- function cookieRead(target){ var cookie_memory = ""; var read_cookie = document.cookie.split("; "); for(var i=0;i<read_cookie.length;i++){ var cookie_split = read_cookie[i].split("="); if(cookie_split[0] == target){ cookie_memory = cookie_split[1]; break; } } return cookie_memory; } function extract(){ backURL = cookieRead("ref");//document.referrer; backDIR = backURL.split("/"); document.getElementById("ref").value = backDIR[4] + "/" + backDIR[5]; } //--> </script>

kajiya16
質問者

お礼

たびたびありがとうございます。 しかしなんだかうまく動きません。 きっとCyberCypherさんのおっしゃっていることを 私が理解できていないのだと思いますが 現在のソースを補足に書きます。

kajiya16
質問者

補足

下記のjsでリンク先を別窓、サイズ指定で開いています。 <script type="text/javascript"> <!-- function m_win(url,windowname,width,height) { var features="location=no, menubar=no, status=yes, scrollbars=yes, resizable=yes, toolbar=no"; if (width) { if (window.screen.width > width) features+=", left="+(window.screen.width-width)/2; else width=window.screen.width; features+=", width="+width; } if (height) { if (window.screen.height > height) features+=", top="+(window.screen.height-height)/2; else height=window.screen.height; features+=", height="+height; } window.open(url,windowname,features); } //--> </script> リンク元のリンク部分 <script type="text/javascript"> <!-- document.cookie = "ref=" + location.href; //--> </script> <a href="http://aaa.jp/bbb/ccc/123/ddd.html" onclick="m_win(this.href,'mywindow1',690,600); return false;"> <img src="eee.gif"> </a> リンク先 <html> <head> (回答No.3のjs) </head> <body onload="extract()"> <input type="text" id="ref" value=""> </body> </html>

回答No.2

//直前にアクセスしたURL取得 backURL = document.referrer; //削除対象 dnf = "http://aaa.jp/bbb/"; //直リンとかだと取得できないので if(0 <= backURL.indexOf(dnf)){   //余計な部位削除   backDir = backURL.split(dnf).join("");   document.getElementById("ref").value = backDir; }else{   //直リンされてますよ   return; } <input type="text" id="ref" /> ……みたいな?

kajiya16
質問者

お礼

ありがとうございます。 頂いた回答を元に自分なりにソースを書いてみました。 詳しくは補足のほうに書かせて頂きます。

kajiya16
質問者

補足

<html> <head> <script type="text/javascript"> <!-- function extract(){ backURL = document.referrer; backDIR = backURL.split("/"); document.getElementById("ref").value = backDIR[4] + "/" + backDIR[5]; } //--> </script> </head> <body onload="extract()"> <input type="text" size="60" id="ref" value=""> </body> </html> 上記のようにしてみました。 しかし chrome firefox では狙いどうりの動作をするのですが IEでは undefind/undefind となってしまいました。 どこかにIEではサポートされていない命令が含まれているのでしょうか?

回答No.1

ブラウザ依存ですが簡単な方から //直前にアクセスしたURL取得 backURL = document.referrer; //余計な部位削除 //split:指定した文字列を区切り文字として扱い配列化 //join:配列を指定した区切り文字で結合 backDir = backURL.split("http://aaa.jp/bbb/").join(""); 後はbackDirを扱えば良いかな? 後はアクセスする時に //URLエンコードする事「/」→「%2F」 http://aaa.jp/bbb/ccc/123/ddd.html?req=ccc%2F123%2F ってデータ付属してやるとか クッキーに放り込んでやるとか

kajiya16
質問者

お礼

ありがとうございます。 勉強になります。

関連するQ&A

専門家に質問してみよう