2016-05-03 7 views
0

ページのタイトルに基づいてdivを表示または非表示にしようとしています。これは、値をページに渡すより良い方法を見つけられないためにのみ必要です。 HTMLファイルでもJavascript string.slice()に負の値がある

function toggle(divId) { 
    var divArray = document.getElementsByTagName("div"); 
    for(i = 0; i < divArray.length; i++){ 
     if(divArray[i].id == divId){ 
      if(divArray[i].style.display != 'none'){ 
       divArray[i].style.display = 'none'; 
      }else{ 
       divArray[i].style.display = ''; 
      } 
     } 
    } 
} 

    function togglePayLink() { 
    var h1Array = document.getElementsByTagName("h1"); 
    for(i = 0; i < h1Array.length; i++){ 
     if(h1Array[i].id == 'Title'){ 
      var title = h1Array[i].innerHTML; 
      title = title.slice(1); 
      title = title.slice(-4); 
      toggle('descr'+ title); 
     } 
    } 
} 

ページのタイトルと見出しされています

ここでHTMLファイル内の現在のコードです。 %% GLOBAL_PageTitle %%は、私がアクセスできないサーバー側のコードに置き換えられます。ただし、値は「$ 100料金」(数値が異なる)になります。

<h1 id="Title" class="TitleHeading">%%GLOBAL_PageTitle%%</h1> 

は最後に、私は、フォーマットDESCR +数のidの持つ隠されたdiv要素のセットを持っているので、ページのタイトルは「$ 100料金」である場合、私は、ID「descr100」とdiv要素を示したいと思います。

<div id="descr100" style="display:none;width: 75%;"></div> 

上記のスクリプトを実行するとエラーは表示されません(私はChromeのコンソールを使用しています)が、divは表示されません。私はトグル機能が動作していることは分かっています。なぜなら、以前はトグルしなければならなかったページ上の1つのdivだけで使用されていたからです。私は問題と思われるtogglePayLink関数を書いたが、これをどのようにデバッグするのか分からない。私は、タイトルのドル記号が問題を引き起こす可能性があるのだろうかと思っていましたが、そうであればエラーが出ると思います。

EDIT:togglePayLink関数をstringの代わりにvarを使用するように変更しましたが、slice()が呼び出されたときにtypeErrorが発生しました。

+0

これはスクリプトのクリーンアップに役立ちますが、jquery(http:// api)の.hide()/。show()関数を見ることができます。jquery.com/hide/)と疑似セレクタ.contains(https://api.jquery.com/contains-selector/) – Alyss

+0

特定のIDを持つ要素を見つけるためにループする必要はありません。 'getElementById'を使って直接見つけることができます。 –

+0

'String title = h1Array [i] .innerHTML;'という行が文法エラーを生成しないことはほとんどありません。とにかく、デバッガを使用してコードごとにステップごとにステップを進め、各ポイントで変数を調べる必要があります。最後に、スタイルプロパティを直接操作することは、クラスをトグルするよりも一般的にあまり好ましくありません。これは 'elt.classList.toggle( 'hide') 'などで行うことができます。また、弦の配線された箇所でのスライシングは壊れやすくなります。代わりに 'title.match(\/d + /)'のようなものを使うことを検討してください。 –

答えて

0

title.slice(-4)は、私が思ったように、最後の4桁の前のすべてではなく、文字列の最後の4桁を私に与えていました。存在しない 'descrFee' divを切り替えることは何もしていませんでした。

0

問題はここにある:JavaScriptで

String title = h1Array[i].innerHTML; 

、すべての変数は、(他の方法を設定できる機能を除く)VARに設定されています。だから、次のようになります。

<script language="javascript"> 
    var title; 
    function togglePayLink() { 
     var h1Array = document.getElementsByTagName("h1"); 
     for(i = 0; i < h1Array.length; i++){ 
      if(h1Array[i].id == 'Title'){ 
       title = h1Array[i].innerHTML; 
       title = title.slice(1); 
       title = title.slice(-4); 
       toggle('descr'+ title); 
      } 
     } 
    } 
</script> 

var title = h1Array[i].innerHTML; 

また、あなたはおそらく、あなたがループのためにそれを設定しているときに、「VAR」を省略することになる場合には、ループの外でそれを定義する必要があります

編集:forループでのみ使用し、別の繰り返しで使用する場合は、ローカルで定義できるかどうかわかりません。しかし、私はまだそれをグローバルに定義しています。

+1

'getElementById'を使って直接アドレスすることができるときに、特定のIDを持つものを見つけるためにすべての' h1'タグをループするのはなぜですか? –

+0

*さらに、forループの外側に定義する必要があるかもしれません。*なぜですか? –

+0

@torazaburo私は単にそれをプログラムした方法をそのまま残しました。後で使用する必要がある場合に備えて、ループの外側に定義しました。 – Feathercrown

1

今後、%% GLOBAL_PageTitle %%を使用してページに一意のクラスを割り当ててください。この方法で、CSSを使用して要素を表示/非表示にすることができます。 BigCommerceは、個々のページ(例:Webページ、アカウント、カート)のためにH1のHTMLへのアクセス権を与えないページの場合

<div class="page %%GLOBAL_PageTitle%%"> 

、私は通常、ページタイトルを取り除くために、ページの読み込みにこのスクリプトを実行しますページ要素に特定のクラスを割り当てます。

var catName = $('.TitleHeading').text(); 
var catName = catName.replace(/ /g, '');   
var catName = catName.replace(/'/g, ''); 
var catName = catName.replace(/&/g, ''); 
var catName = $.trim(catName); 
$('.page').addClass(''+catName+''); 

あなたのやり方は少し上にあるようですが、それが他の人によってこのように設定されていれば分かります。

+0

私はCSSを使用している場合、静的に表示されている要素ではありませんか?ページの読み込みにdivを表示することはできません。 – dragoncmd

+0

私はすべてのdivを非表示にして、ページにその特定のクラスがあるときにCSSを使って表示したいものだけを表示します。 – thannes

関連する問題