2016-11-18 11 views
1

どこに置いても機能しません。 意味、htmlファイルの中でスクリプトタグ内では動作しません。その下にないhideShow関数の上では動作しません。 私は1つのJSファイルとhtmlファイルを持っています。 JSファイルには2つの関数がありますが、最初の関数はうまくいきますが、2番目の関数を呼び出そうとすると、うまくいきません.wclasはonclick = "imgのプロパティは動作します。 ここで言われてJSファイル:JS関数の<img>タグが呼び出されません

function hideShow(x,y) { 
    var hide = document.getElementById(x); 
    var show = document.getElementById(y); 
    if (!hide.classList.contains("height-zero") && show.classList.contains("height-zero")) { 
     hide.classList.add("height-zero"); 
     show.classList.remove("height-zero"); 
    } else { 
     hide.classList.remove("height-zero"); 
     show.classList.add("height-zero"); 
    } 
} 

function changeSource(x) { 
    this.src = x; 
} 

そして、これは私が

<img src="img/label.png" onClick="changeSource('img/label2.png')"> 

は注意私が持っているIMGタグにそれを置く方法である複数の画像

あなたが thisを渡す必要が
+0

コンテキストとして 'this'を渡していないためです。関数#call(thisCtx、args)または関数#apply(thisCtx、argCollectionObj)で可能です。 - > 'changeSource.call(this、" img/label2.png ")' – Hydro

答えて

3

あなたの機能:

<img src="img/label.png" onClick="changeSource(this, 'img/label2.png')"> 

function changeSource(el, x) { 
    el.src = x; 
} 
+0

ありがとうございます。私は、この関数が呼び出されたオブジェクトを参照していることを関数が知っていると思っていましたが、今は動作しています。 5分でこれを答えとして受け入れます。 –

+0

@ J.H。関数は他の関数から呼び出すことができるので、 'this'は2つの異なるものにリンクし、それは間違っています。 – Justinas

+0

インライン関数は適切な方法ではありません。 – mplungjan

0

他の回答に代わって、インラインからスクリプトタグにイベントを割り当てる場合は、thisを使用できます - 今すぐthiswindowです。

複数の画像を持っている場合は、それらにクラスを与えることができますし、

<img class="labelImage" src="img/label1.png" data-src2="img/label1x.png" /> 
<img class="labelImage" src="img/label2.png" data-src2="img/label2x.png" /> 
<img class="labelImage" src="img/label3.png" data-src2="img/label2x.png" /> 

インラインを使用して

window.onload=function() { 
    var imgs = document.querySelectorAll(".labelImage"); 
    for (var i=0, n=imgs.length;i<n;i++) { 
    imgs[i].onclick=function() { 
     this.src = this.getAttribute("data-src2"); 
     // or possibly this.src = this.src.replace(/label\./,"label2.") 
    } 
    } 
} 

行い、thisも動作しますが、しかし私は、あなたがインライン関数を使用していないお勧めします。

+1

まあ、このソリューションははるかにエレガントです。ありがとう。編集:2番目の考えでは、私はそれを使用する方法では動作しません、私は私がその機能を使用する必要がある多くの画像があります。 –

+0

あなたの解決策は各画像に一意のIDを必要とするため、再利用できず、10枚の画像がある場合、10個の 'onClick'関数宣言が必要になります。 – Justinas

+0

@ J.H。複数の画像は元の説明の一部ではありませんでした。複数の画像の更新をご覧ください。クリックした画像にポストまたはプレフィックスがある場合、data-src2を削除して、置き換えられたバージョンを使用する – mplungjan

0

@Justinasの回答の代わりに、01を渡すことですは、この関数呼び出しのコンテキストです。私のコメントと同じように:

changeSource.call(this, "img/label2.png") 
関連する問題