• 締切済み

jqueryでナビゲーションの現在地を判定させようとしています。

jqueryでナビゲーションの現在地を判定させようとしています。 下記のようなソースで、URLとa要素のhref値が一致する場合はclass="here"をつけています。 $(function(){ $("#gnavi li a").each(function(){ if($(this).attr("href")==location.href) $(this).toggleClass("here"); }); }) しかし http://~~.com/hoge1/ → index.html                A.html                B.html という構成だった場合、index.htmlはhereがつきますが、A、Bに移動するとhereがなくなってしまいます。 hoge1直下にあるファイルの場合どのような名前でもhereをつくようにするにはどうしたらよいのでしょうか。 よろしくお願いいたします。

noname#146582
noname#146582

みんなの回答

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

No1です。 補足を読んでも意味がさっぱりわからない。 locationが『http://ドメイン/hoge1/index.html』の時に、 ナビゲーションのhref属性値の 『http://ドメイン/hoge1/index.html』 と比較すると(同じなので)クラスが変更されるけれど、 locationが『http://ドメイン/hoge1/A.html』の時に、 href属性『http://ドメイン/hoge1/』のものをクラス変更したいという意味なのだろうか? (上の比較方法では一致とみなされない) でもそれって、リンク要素のhref属性だから、そのリンクをクリックするとフォルダ構成が表示されちゃうとか(禁止していれば出ないけど)になるので、リンクにならないと思うけれど?? ますますわからないけれど、もしも、『http://ドメイン/hoge1/A.html』と『http://ドメイン/hoge1/』を一致とみなしたいのなら、文字列の頭から比較すればよいだけなので var loc = location.href; $("#gnavi li a").each(function() { var href = $(this).attr("href"); if (loc.substr(0, href.length) == href) $(this).toggleClass("here"); }); (↑)元のコードそのままだけど、なんでtoggleClassなのかも不明。 (一度実行してセットするだけなのでaddClassではないの?)

noname#146582
質問者

補足

fujillinさん、レスありがとうございます。 どうも説明がへたで申し訳ありません。 http://ドメイン/hoge1/index.html http://ドメイン/hoge1/a.html http://ドメイン/hoge1/b.html という具合にhoge1フォルダーに入っているhtmlが表示されているときはhoge1ボタンにあたる「"#gnavi li a.hoge1」にhereをつける http://ドメイン/hoge2/index.html http://ドメイン/hoge2/c.html http://ドメイン/hoge2/d.html とhoge2フォルダーについている場合は「"#gnavi li a.hoge2」にhereをつける という風にしたいと考えています。 リンクURLは「http://ドメイン/hoge1/」「http://ドメイン/hoge2/」としているので、index.htmlの場合はhrefが同じになるのでhereがつきますが、他のページに移動すると●.htmlがつくため、不一致となりhereがつきません。 そこでURL全てではなく「http://ドメイン/hoge1/」までが一致ならhereをつけるというスクリプトにならないかと試しています。 toggleClassにしているのは、hoge1にhereがついたあとにhoge2に移ったときにhoge1につけたhereを削除する必要があると思っていたのですが、元のスクリプトをaddClassにしても問題はなかったです。ご指摘ありがとうございます。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

完全をきすなら、 if($(this).get(0).href == document.location.protocol + '//' + document.location.hostname + document.location.pathname) か。

noname#146582
質問者

補足

下記の回答とあわせてレスありがとうございます。 get()を調べておぼろげにDOMがわかりました…。 ただ今回はhttp://部分の問題ではなく、フォルダー以下のファイルではhtmlがつくことでパスが一致しなくなっています。 1)ナビゲーションのパスはhttp://ドメイン/hoge1/というようにフルパス記述。 2)フォルダーはhoge1、hoge2・・・とあり、hoge1の中にはindex.html、A.html、B.html・・・と入っている 3)hoge1/index.htmlの場合はhereがつきナビゲーションは反転する。   hoge1/A.htmlではhereはつかずナビゲーションは反転しない。 4)hoge1のフォルダーに入っているhtmlにアクセスする場合は「ナビゲーションhoge」にhereをつけ反転させたい。 5)htmlは今後も増える。 考えが混乱した状態で質問を投稿してしまい申し訳ございません。 http://ドメイン/hoge1/まで一致すればhereをつける前方一致のような方法があればぜひご教示いただければと思います。 よろしくお願いいたします。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

$(this).attr("href")でなく、DOMのHTMLインターフェースで、 $(this).get(0).hrefで取得するとフルパスになるはず。 $(function(){ $("#gnavi li a").each(function(){ if($(this).get(0).href==location.href) $(this).toggleClass("here"); }); }) windows.location.href は document.locationやdocument.URL、document.documentURI でもよしかな?。

noname#146582
質問者

お礼

ありがとうございます。 上の回答に補足をつけさせていただきました。

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

推測ですが… a要素のhref属性の指定がフルパスではないので、文字列比較が=にならないのでは? (IEの場合は相対パスでもフルパスを返すらしいですが…) 以下のような感じではどうでしょうか? 相対パスでも「./A.html」のような指定方法をとっている場合は、さらに修正が必要と思われます。 $(function() {  var loc = location.href;  $("#gnavi li a").each(function() {   var href = $(this).attr("href");   if ( loc.slice(-href.length) == href)    $(this).toggleClass("here");  }); })

noname#146582
質問者

補足

回答ありがとうございます。 私の質問の仕方がわかりにくくて申し訳ありません。 ナビゲーションのパスはhttp://ドメイン/hoge1/というようにフルパス記述しており、index.htmlのページではhereがつきます。 同じhoge1フォルダー内にあるa.htmlやb.htmlにアクセスしたときはhoge/の後ろにHTML名がついてしまうためhereがつかないところまでは理解できています。 フォルダー内のファイルは今後も増えていくので、前方一致でhereをつけるようなことはできないでしょうか。 よろしくお願いいたします。

関連するQ&A

  • jqueryについて

    jqueryについて こんな内容のjqueryをひとつにまとめて、なおかつ01~99(実績数)までのidを割り振る設定したいのですが可能でしょうか? 例えば $(function(){ $("#navi01-99 a").click(function(){ $("#main01-99 img").attr("src",$(this).attr("href")); return false; }); みたいな感じであとはidに番号を付ければいいみたいな・・・出来ませんでしょうか? 用途は仕事の制作実績で使用したいのですが、どなたか教えていただけますでしょうか? $(function(){ $("#navi01 a").click(function(){ $("#main01 img").attr("src",$(this).attr("href")); return false; }); }); $(function(){ $("#navi02 a").click(function(){ $("#main02 img").attr("src",$(this).attr("href")); return false; }); }); $(function(){ $("#navi03 a").click(function(){ $("#main03 img").attr("src",$(this).attr("href")); return false; }); }); $(function(){ $("#navi04 a").click(function(){ $("#main04 img").attr("src",$(this).attr("href")); return false; }); }); $(function(){ $("#navi05 a").click(function(){ $("#main05 img").attr("src",$(this).attr("href")); return false; }); });

    • ベストアンサー
    • AJAX
  • jQueryでの記述をjavascriptに

    下記のjQueryの記述をライブラリ無しのjavascriptでの記述にしていただきたいです。 imgタグのsrc属性とaタグのhref属性を相対パスから絶対パスに動的に変換させる必要があるのですが、ある事情でjQueryを使えないとの事で困っています。 どうかよろしくお願い致します。 <script type="text/javascript"> $(function(){ $('#hoge').children('img:not([src^=http])').each(function (){ var imgSrc = $(this).attr('src'); $(this).attr('src','http://xxxxxxxxxxxx' + imgSrc); }); $('#hoge').children('a[href^=○○○]').each(function (){ var aHref = $(this).attr('href'); $(this).attr('href','http://xxxxxxxxxxxx' + aHref); }); }); </script>

  • jQuery 記述方法

    今、webサイトを作っていてjQueryを使用しようとしています。 しかし、うまくできません。外部にjavascriptファイルを置いています。 やりたいことは、ナビゲーションのロールオーバーです。 javascriptは初心者なのでどこが間違っているまたは足りないのかわかりません。以下に必要だと思うものを記述しますので分かる方がおりましたら教えてください。 javascriptファイルとjquery-1.6.4.min.jsはhtmlと同フォルダ内にあります。またimgフォルダ内に画像と拡張子の前に_onを付けた画像を入れています。 HTML <head> <script type="text/javascript" src="./jquery-1.6.4.min.js"></script> <script type="text/javascript" src="park.js"></script> </head> <body> <p><a href="index.html"> <img alt="top" height="50" class="navi" src="img/top.gif" width="100" /></a></p> </body> javascript $(function(){ $ ("img.navi").mouseover(function(){ $(this).attr("src",$(this).attr("src") .replace(/^(.+)(¥.{a-z]+)$/,"$1_on$2")); }).mouseout(function(){ $(this).attr("src",$(this).attr("src") .replace(/^(.+)_on(¥.{a-z]+)$/,"$1$2")); }).each(function(){ $("<img>").attr("src",$(this).attr("src") .replace(/^(.+)(¥.{a-z]+)$/,"$1_on$2")); }); ]); です。 よろしくお願いします。

  • jQueryで困っています。教えてください。

    スムーススクロールを導入しようと、いろいろ調べて以下のものを参考にさせていただこうと考えています。どうゆう流れになっているのかを調べて分からないことがあったので投稿させていただきました。var target = jQuery(href == "#" || href == "" ? 'html' : href);この行の意味がわかりません。また、targetに何が代入されているのか分かりません。回答よろしくお願いします。 jQuery-------------------------------------------- //スムーズスクロール jQuery(function(){ // #で始まるアンカーをクリックした場合に処理 jQuery('a[href^=#]').click(function() { // スクロールの速度 var speed = 1000; // ミリ秒 // アンカーの値取得 var href= jQuery(this).attr("href"); // 移動先を取得 var target = jQuery(href == "#" || href == "" ? 'html' : href); // 移動先を数値で取得 var position = target.offset().top; // スムーススクロール jQuery('body,html').animate({scrollTop:position}, speed); return false; }); });

  • jqueryについて【初歩】

    見ていただきありがとうございます。 jqueryについて初歩的な質問です。 下記の記述は ひとつのボックスに対して内包するaタグのリンクを指定してボックスごとリンクにしているスクリプトになりますが、これにtargetの属性を付加させたいです。 しかしいろいろ試しましたがうまくいかず、ツンでます… jqueryに精通している方宜しければご回答いただけませんでしょうか? よろしくお願いいたします。 $(function(){ $(".sampleBox").click(function(){ window.location=$(this).find("a").attr("href"); return false; }); });

  • jQueryの$(this)について

    閲覧ありがとうございます。 初歩的な質問で申し訳ないのですがthisのことがすこし混乱してしまい、わからなくなってしまったので下記の場合のthisはどこを読み込むか教えてもらえると助かります。 目的:aをクリックしたときimgのsrcにaのhrefに指定してあるものを埋め込む処理 $(function(){ $("a").click(function(){ $("ul li img").fadeOut(function(){ $(this).attr(src,$("a").attr("href")).fadeIn(); }); return false; });

  • JQueryを使ってcssを書き換え

    何となくコードを見てさわる程度の初心者です。 以下のようなソースを組みました。 <div id="slide"> <a href="01.htm"><img src="01.jpg" alt="01" id="alttxt" /></a> </div> <div id="slidenavi"> <ul> <li><a href="01.html"><img src="s_01.jpg" alt="01" class="b_01.jpg" /></a><span class="active"></span></li> <li><a href="02.htm"><img src="s_02.jpg" alt="02" class="b_02.jpg" /></a><span class="active"></span></li> <li><a href="03.html"><img src="s_03.jpg" alt="03" class="b_03.jpg" /></a><span class="active"></span></li> </ul> </div> #slideがメインエリアで、#slidenaviがメインエリアの画像とリンク先を切り替えるナビゲーションボタンになっています。 ナビに連動したメインエリア用の画像ファイル名は #slidenavi の img の classに入れておいて、それを読み込んで代入するというおかしなやり方で呼び出していますが、ここまではうまくいきました。 問題はここからです。 最初の状態では<span class="active"></span>はcssの設定でdisplay: noneとしてあります。 そして#slidenaviのボタンにマウスが乗ると、その部分の<span class="active"></span>をdisplay: blockとして表示したいのですが、これがどうしてもうまくいきません。 この部分も含めて、おかしな書き方になっている部分があれば教えてもらえないでしょうか。 jsファイルは以下の通りです。 $(function(){ $('#slidenavi ul li a').fadeTo(0,0.4); $('#slidenavi ul li a').hover(function(){ $(this).fadeTo(300,1.0); }, function(){ $(this).fadeTo(300,0.4); }) $('#slidenavi ul li img').mouseover(function(){ var bglink = $(this).attr("class"); var altTxt = $(this).attr("alt"); $("#slide img").attr("src","images/home/main/"+bglink); $("#slide img").attr("alt",altTxt); $("#slide span.active").css("display","block"); }); $('#slidenavi ul li a').mouseover(function(){ var Href = $(this).attr('href'); var Tget = $(this).attr('target'); $("#slide a").attr("href", Href); $("#slide a").attr("target", Tget); $("#slide a").click(function() { window.open(Href,'_self'); return false; }); }); });

  • jqueryのスライドするナビゲーションについて

    現在、以下のjqueryを使用して横スクロールサイトを作成しているのですが、 (Smooth Vertical or Horizontal Page Scrolling with jQuery) http://tympanus.net/codrops/2010/06/02/smooth-vertical-or-horizontal-page-scrolling-with-jquery/ ナビゲーションに別のjQuery MagicLine Navigationというjqueryのスライドするメニューを配置しています。 デモ http://css-tricks.com/examples/MagicLine/ このスライドするラインを表示中のコンテンツに合わせてストップさせたいのですが、 横スクロールサイトでコンテンツが一つのhtmlファイルのため 止めることができません。 これを止める方法があれば実現させたいのですが、 どなたかお分かりの方がおられましたらご教授頂けませんでしょうか。 <javascript> $(function() { var $el, leftPos, newWidth, $mainNav = $("#example-one"); $mainNav.append("<li id='magic-line'></li>"); var $magicLine = $("#magic-line"); $magicLine .width($(".current_page_item").width()) .css("left", $(".current_page_item a").position().left) .data("origLeft", $magicLine.position().left) .data("origWidth", $magicLine.width()); $("#example-one li a").hover(function() { $el = $(this); leftPos = $el.position().left; newWidth = $el.parent().width(); $magicLine.stop().animate({ left: leftPos, width: newWidth }); }, function() { $magicLine.stop().animate({ left: $magicLine.data("origLeft"), width: $magicLine.data("origWidth") }); }); }); <html> <div class="nav-wrap"> <ul class="group" id="example-one"> <li class="current_page_item"><a href="#">Home</a></li> <li><a href="#">Buy Tickets</a></li> <li><a href="#">Group Sales</a></li> <li><a href="#">Reviews</a></li> <li><a href="#">The Show</a></li> <li><a href="#">Videos</a></li> <li><a href="#">Photos</a></li> <li><a href="#">Magic Shop</a></li> </ul> </div> どうぞ宜しくお願いいたします。

  • jQuery1.7.2でのdisabledの扱い方

    jQueryで質問させてください。 自分は、チェックボックスとテキストエリアを連動させて、 チェックボックスがチェックされると、disabledが設定されていたテキストエリアが入力可能になり、 チェックボックスのチェックが外されるとテキストエリアに入力不可になるようなものを作っていました。 jQuery1.4.4では以下のように書いて動いていました。 しかし、1.7.2にするとどちらも動かなくなりました。 1.7.2の場合はどのように記述すると以下と同じような動きになるのでしょうか? 宜しくお願いします。 $(document).ready(function() { $('#hogecheck').click(function(e) { if($('#hoge').attr('disabled') == true) { $('#hoge').attr('disabled', ''); } else { $('#hoge').attr('disabled', 'disabled'); } }) });

  • jqueryの質問。

    毎回、お世話になります。 jqueryを使ってリンク文字をクリックすると画像が変更できるようにしたいのですが、 上手くいきません。 <HTML> <body> <ul> <li><a href="DSC_0014.jpg">a</a></li> <li><a href="kamen.jpg">b</a></li> <li><a href="irumi.jpg">c</a></li> </ul> <p><img src="DSC_0014.jpg" width="1000" height="671"> <SCRIPT> $(function(){ ("a:eq(0)").click(function(){ $("img").attr("src","DSC_0014.jpg").attr("alt","人物"); return false }); $("a:eq(1)").click(function(){ $("img").attr("src","kamen.jpg").attr("alt","仮面"); return false }); $("a:eq(2)").click(function(){ $("img").attr("src","irumi.jpg").attr("alt","イルミ"); return false }); }); このコードだとリストa,b,cをクリックすると別ページに画像が表示されます。 その場での画像切り替えをしたいのですが、どこが間違っているのでしょうか? 宜しくお願い致します。

専門家に質問してみよう