ページのリンクを取得する方法とオンラインでの問題

このQ&Aのポイント
  • スクリプトを使用してページのリンクを取得する方法を説明します。
  • オンラインでの問題についても触れます。
  • よそのサイトのリンク情報は取得できない可能性があります。
回答を見る
  • ベストアンサー

ページのリンクを取得する

次のようなスクリプトを作りました。 GoLinks() でリンクを取得したいページを開いてそのページのリンクを取得し、 LinkCount() でそのリンクを表示する、というものです。 var msg = "リンクの一覧:<br>"; function GoLinks () { var srcwin = window.open('該当ファイルのパス','srcwin',''); if(srcwin.document.links.length != 0){ for (i=0; i<srcwin.document.links.length; i++){ msg = msg + srcwin.document.links[i] + "<br>"; } setTimeout('LinkCount()',3000); }else{ msg = msg + "このページにリンクは存在しません。<br><br><br><br>"; setTimeout('LinkCount()',3000);  } } function LinkCount(){ var win1 = window.open('','newwin1',''); win1.document.write(msg); } 問題は、 たとえば同じディレクトリの index.html のリンクを読もうとして「該当ファイルのパス」の部分を「index.html」としたところ、ローカルでは正常に動作しました。 ところがオンラインでは、index.html は開かれるものの、LinkCount() の結果「このページにリンクは存在しません。」と表示されます。 何がおかしいのかわかりません。 ついでに、まったくよそのサイト(たとえば http://service.okweb.jp/community/guide/index.html とか)のページを指定した場合には、LinkCount() が動作しません(ウィンドウも開きません)。 よそのサイトのリンク情報は取得できないものなのでしょうか。

  • Nao_F
  • お礼率48% (15/31)

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

  • ベストアンサー
  • EUR
  • ベストアンサー率61% (29/47)
回答No.3

window.openはサーバーとセッションを開始したら、すぐに次の処理に入ってしまいます。 よって取得するページのlinksオブジェクトを取得するまもなくlinks.lengthを取得するので、オブジェクト数は0が入ってしまいます。 これを回避するために、window.openをした後、ドキュメントをすべて取得するまで待ってやる必要があります。 ソースを修正して見ました。 例では、window.openでセッションを開始してから5秒間ウェイトしています。 <html> <head> <script language="javascript"> var msg = "リンクの一覧:<br>"; var srcwin; function GoLinks () {   srcwin = window.open(該当ファイルのパス','','');   setTimeout("GetLinks()", 5000); } function GetLinks() {   if(srcwin.document.links.length != 0){     for (i=0; i<srcwin.document.links.length; i++){       msg = msg + srcwin.document.links[i] + "<br>";     }     setTimeout('LinkCount()',3000);        }else{          msg = msg + "このページにリンクは存在しません。<br><br><br><br>";     setTimeout('LinkCount()',3000);        } } function LinkCount(){   var win1 = window.open('','newwin1','');   win1.document.write(msg); } </script> </head> <body onLoad="GoLinks()"> </body> </html>

Nao_F
質問者

お礼

遅くなりましてすみません。 これでできるようになりました。ありがとうございます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1様と同じですが links[i].href としてみて下さい。 >まったくよそのサイト ドメインが違うよそのサイトのwindowの中身は、(セキュリティ上の制限で)読み出せなかったように思います。

Nao_F
質問者

お礼

#1 にも書いたとおりで、links[i].href にしても結果は同じでした。 他サイトの場合は無理なんですね。ありがとうございました。

  • bob_n
  • ベストアンサー率35% (610/1732)
回答No.1

>if(srcwin.document.links.length != 0){ >for (i=0; i<srcwin.document.links.length; i++){ >msg = msg + srcwin.document.links[i] + "<br>"; >} のmsg = msg + srcwin.document.links[i].href + "<br>"; ではどうでしょうか。 余り詳しくないのでできるかどうか自信はないです。

Nao_F
質問者

お礼

残念ながら links[i] を links[i].href にしても結果は同じでした。 不思議ですね・・・。 まさかサーバーの設定で links プロパティを取得できないなんてことは・・・???

関連するQ&A

  • リンク一覧の表示

    <SCRIPT language="JavaScript"> <!-- function ShowLinks(){ var msg = "リンクの一覧:<BR>"; for(i=0; i < document.links.length; i++){ msg = msg + "<A href=" + document.links[i] + ">" + document.links[i] + "</A><BR>"; } var new1 = window.open('','new1', 'toolbar=1, location=1, status=1, menubar=1, scrollbars=yes, resizable=1, width=650, height=800'); new1.document.write(msg); new1.document.close(); } //--> </SCRIPT> 下記のように表示されるのを リンクの一覧: http://***.ne.jp/bbns.cgi http://***.ne.jp/abc.cgi 下記のように番号を付けて表示したいのですが リンクの一覧: 0:http://***.ne.jp/bbns.cgi 1:http://***.ne.jp/abc.cgi

  • javascript/他ページ内リンクでもスムーズスクロールさせたい

    javascript/他ページ内リンクでもスムーズスクロールさせたい お世話になります。 page1.htmlのページ内リンクにスムーズスクロールを設定しています。ページ内に#aとアンカー設定し、page1.html内で移動するときはもちろん問題ありません。 これをpage2.htmlからpage1.html#aにリンクさせる際にもスムーズスクロールで移動させるにはどうしたら良いのでしょうか? そもそもそんなことはできないのでしょうか? ソースを書かせていただきたいのですが、文字数が足りません。とりあえず最初の方だけ書きます。 var ss = { fixAllLinks: function() { var allLinks = document.getElementsByTagName('a'); for (var i=0;i<allLinks.length;i++) { var lnk = allLinks[i]; if ((lnk.href && lnk.href.indexOf('#') != -1) && ( (lnk.pathname == location.pathname) || ('/'+lnk.pathname == location.pathname) ) && (lnk.search == location.search)) { ss.addEvent(lnk,'click',ss.smoothScroll); } } }, smoothScroll: function(e) { if (window.event) { target = window.event.srcElement; } else if (e) { target = e.target; } else return; if (target.nodeName.toLowerCase() != 'a') { target = target.parentNode; } if (target.nodeName.toLowerCase() != 'a') return; anchor = target.hash.substr(1); var allLinks = document.getElementsByTagName('a'); var destinationLink = null; for (var i=0;i<allLinks.length;i++) { var lnk = allLinks[i]; if (lnk.name && (lnk.name == anchor)) { destinationLink = lnk; break; } } 続きは補足欄に書かせていただけそうなら書きます。 中途半端な情報かつ長文で申し訳ありません。 どんな些細なことでも構いませんので、アドバイスいただけないでしょうか。 どうぞよろしくお願いいたします。

  • 文字を一文字ずつ表示

    JavaScriptで文字を一文字ずつ表示するサンプルを見つけ、使おうとしたところdocument.allが使われていた為、ネスケで対応できない事が分かりました。ネスケ4.7で対応するようにするにはどのように変えたらいいのか教えて頂きたく宜しくお願いいたします。 <SCRIPT Language="JavaScript"> <!-- var msg="Welcome!!"; i=0; function Start(){ if(i<=msg.length){ if(document.all){ myText.innerHTML = msg.substring(0,i); }else if(document.layers){ document.myText.document.open(); document.myText.document.write(msg.substring(0,i)); document.myText.document.close(); } i=++i; setTimeout("Start()",200); }else{ i=0; setTimeout("Start()",1000); } } // --> </SCRIPT> </HEAD> <BODY onLoad="Start()"> <DIV id="myText"></DIV> </BODY> 宜しくお願い致します。

  • javascriptによる動的なリンクの変更

    javascriptによって、ラジオボタンをチェックする度に(チェックを変える度に) 動的にリンクを変更したいのですが、上手くいきません。 すみませんが、どなたか教えていただけないでしょうか? ちなみに、下記は私が試したコードです。(全く動きませんが。) ラジオボタンのチェックを変えると、<a>タグのhrefの中身のURLが、そのボタンのvalueに対応して変わるようにしたいのですが。。 <FORM NAME="sample"> 選択して下さい -->  <input type="radio" name="list" OnChange="UpdateLink()" value="http://www.yahoo.co.jp" />s <input type="radio" name="list" OnChange="UpdateLink()" value="http://www.vector.co.jp/authors/VA011407/" />m <input type="radio" name="list" OnChange="UpdateLink()" value="mailto:akirayu@a2.mbn.or.jp" />l <A href="samplelink">リンク更新!!</A> </FORM> <SCRIPT LANGUAGE="JavaScript"> <!-- var pos; for(var i=0; i < document.links.length; i++) { if (document.links[i].href.indexOf("samplelink") != -1) pos = i; } function UpdateLink() { checked = document.sample.list.checked Index; document.links[pos].href = document.sample.list[checked ].value; } //--> </SCRIPT>

  • 1ページ内で複数のwindow.onload = functionの動作

    Ajaxを使用して取得してきたRSSをinnerHTMLで表示するスクリプトを1ページ内に複数設置したいのですが、うまくいきません。 prototype.jsを使うと複数のonloadを制御できるという記事を参考にしたのですが、動作しませんでした。(WindowsIE6で検証してます) http://hori-uchi.com/archives/2005_09.html BODY以下のソースはこちらです。現状だとどちらか一つだけなら動作する感じです。これをどちらも動作する方法をご教授いただけませんでしょうか。宜しくお願いします。 //RSS取得1箇所目 <div id="p1">roading1</div><script> window.onload = function(){ var u = document.getElementsByTagName("head")[0].appendChild(document.createElement("script")); u.type = "text/javascript"; u.charset = "utf-8"; u.src = "http://###"; } var xml = {}; xml.onload = function(data){ var items1 = data.items; var g = "\n"; for(var i = 0; i < Math.min(items1.length, 20); i++){ // } document.getElementById("p1").innerHTML = g; } </script> //RSS取得2箇所目 <div id="p2">roading2</div><script> window.onload = function(){ var u = document.getElementsByTagName("head")[0].appendChild(document.createElement("script")); u.type = "text/javascript"; u.charset = "utf-8"; u.src = "http://***"; } var xml = {}; xml.onload = function(data){ var items2 = data.Result; var h = "\n"; for(var i = 0; i < Math.min(items2.length, 20); i++){ // } document.getElementById("p2").innerHTML = h; } </script>

  • nullまたはオブジェクトではありません

    どなたかよろしくお願いします。 以下のスクリプトで動作確認中にエラーが表示されます。 13行目「'src'はnullまたはオブジェクトではありません」とでます どうやって直したら良いのかわかりません。 IEの「スクリプトのエラーを表示しない」をすれば 一応希望通りに動くので、問題ないとは思うのですが気になります。 どうすれば解消できるでしょうか。 function setLinkListener () { var links = document.links; for (var i = 0; i < links.length; i++) { var link = links [i]; if (link.linkees) { link.onmouseover = function () { for (var i = 0; i < this.linkees.length; i++) { var linkee = this.linkees [i]; // changePseudoLinkClassName (linkee); if (linkee.tagName == "IMG") changeImage (linkee, linkee.src.replace ("_over.gif", ".gif").replace (".gif", "_over.gif")); if (linkee.tagName == "TD") { var image = linkee.getElementsByTagName ("img")[2]; changeImage (image, image.src.replace ("_over.gif", ".gif").replace (".gif", "_over.gif")); } } }; link.onmouseout = function () { for (var i = 0; i < this.linkees.length; i++) { var linkee = this.linkees [i]; // restorePseudoLinkClassName (linkee); if (linkee.tagName == "IMG") restoreImage (linkee); if (linkee.tagName == "TD") restoreImage (linkee.getElementsByTagName ("img")[2]); } }; } } }

  • 順番号をつけたhtmlファイルのページ推移

    順番号をつけたhtmlファイルへページ推移させたいんですが、現在のファイルの番号を取得して次ページ(++)と前ページ(--)へ数値を代入する方法がわかりません。また、最小値と最大数に達したときにindex.htmlに移動するようにしたいです。 未熟な上、書いてみましたが、動きやしません… [次ページへ] <SCRIPT LANGUAGE="JavaScript"> function.next;{ document.links[sample(i).html]; for (i=0; i<最大値; i++); } </SCRIPT> <a href="javascript:next">次へ</a> [前ページへ] <SCRIPT LANGUAGE="JavaScript"> function.next;{ document.links[sample(i).html]; for (i=0; i>0; i--); } <a href="javascript:back">戻る</a> </SCRIPT> 「もし、最大値と最小値に達したとき、index.htmlに移動する」 はわかりませんでした。 ご教授いただければ幸いです。

  • javaスクリプトでリンク付のスクロールテキストを作成したいのですが、

    javaスクリプトでリンク付のスクロールテキストを作成したいのですが、困っております。 参考サイトを探し、下記の状態まで作成しております。 <html> <head> <script language="JavaScript"> <!----- var msg = "テキスト"; msg = msg + "     "; msg = msg + "テキス2"; msg = msg + "     "; var speed = 200; function textDisp(){ msg = msg.substring(1,msg.length) + msg.substring(0,1); document.form1.text1.value = msg; setTimeout("textDisp()",speed); } var winTarget = "_self"; var url = "http://www.yahoo.co.jp/"; function textlink(){ open(url, winTarget); } //-----> </script> </head> <body bgcolor="white" onLoad="textDisp();"> <form name="form1"> <input type="text" name="text1" size="60" onclick="textlink();" style="cursor:hand;border:none;color:#ff3399;" onMouseover="this.style.color='#ffcc00'" onMouseout="this.style.color='#ff3399'"> </form> </body> </html> 表示時に”テキスト”と”テキスト2”を独立してそれぞれ、違うリンク先に飛ばすには どのようにすればよろしいでしょうか? また、空白をのぞき、リンク部分だけに下線をつけたいです。 CSSで指定をすると文字から空白まですべてに下線が付いてしまいます。 説明が悪いかもしれませんが、もしお分かりになる方おられましたら、参考サイトでも かまいませんのでお教えいただけますと幸いです。

  • JavaScriptで関数を呼びだしの繰り返しを

    GoogleMapを使ったアプリケーションをJavaScriptでプログラミングしています。 現在地取得をしている関数内で現在地取得する度にバイブレーションをしています。 その関数の呼びだしを繰り返し行って現在地を更新していますが、今の私のスマートフォンだと一度バイブレーションしてから次バイブレーションするまで15秒程度かかります。 もっと間隔を短くして振動させたいのですが方法はあるでしょうか? ソースは以下です。 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" /> <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> <title>VIBRATION1</title> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> function vibration1(){ var x = 100; var pattern = [30]; var vibPattern = []; for(var i=0; i<pattern.length; i++){ vibPattern[i] = x * pattern[i]; } if(window.navigator.vibrate){ window.navigator.vibrate(vibPattern); }else if(window.navigator.mozVibrate){ window.navigator.mozVibrate(vibPattern); } else if(window.navigator.webkitVibrate){ window.navigator.webkitVibrate(vibPattern); }else{ alert("Not support."); } var msg = ""; msg += "window.navigator.vibrate = " + escape(window.navigator.vibrate) + "<br /><br />"; msg += "window.navigator.mozVibrate = " + escape(window.navigator.mozVibrate) + "<br /><br />"; msg += "window.navigator.webkitVibrate = " + escape(window.navigator.webkitVibrate) + "<br /><br />"; document.getElementById("msg").innerHTML = msg; } </script> <script type="text/javascript"> function initialize() { var myOptions = { zoom: 17, mapTypeId: google.maps.MapTypeId.HYBRID } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); // 精度UPあり var position_options = { enableHighAccuracy: true }; // 現在位置情報を取得 navigator.geolocation.watchPosition(function(position) { var myLatlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); map.setCenter(myLatlng); vibration1(); // マーカーの表示 var marker = new google.maps.Marker({ position: myLatlng, map: map }); }, null, position_options); } </script> <style type="text/css"> html, body { height: 100%; margin: 0; padding: 0; } #map_canvas { height: 100%; } </style> </head> <body onload="initialize()"> <div id="map_canvas"></div> </body> </html>

  • VBAでリンクを踏みたい

    とあるサイトにログインした後に、「このページを印刷する」というリンクをVBAでクリックしたいのですが ソースは <div class="section sideinfo"> <a href="#" class="print" onClick="JavaScript:openPrintWindow('CG017_001', 'CG018'); return false;">このページを印刷する</a> </div> こうなっています。 VBAコードで objIE.Document.all.Item("JavaScript:openPrintWindow('CG017_001', 'CG018')").Click をすると、「オブジェクト変数または With ブロック変数が設定されていません。」になります。 For i = 0 To objIE.Document.Links.Length - 1 'Debug.Print objIE.Document.Links(i).innerHTML If objIE.Document.Links(i).innerHTML = "このページを印刷する" Then objIE.Document.Links(i).Click Exit For End If Next i これで踏むことはできるのですが、 ソースから文字を探してそれをVBAコードにあてて踏むことはできないのでしょうか?