「+1」をクリックすると、「0」に「NaN」が表示されます。なんで ?
HTML:
<table>
<tr><td id="run">0</td></tr>
</table>
<a href="#" onclick="plus();">+ 1 </a>
JS:
function plus(){
document.getElementById("run").innerHTML = ( document.getElementById("run").value + 1 );
}
「+1」をクリックすると、「0」に「NaN」が表示されます。なんで ?
HTML:
<table>
<tr><td id="run">0</td></tr>
</table>
<a href="#" onclick="plus();">+ 1 </a>
JS:
function plus(){
document.getElementById("run").innerHTML = ( document.getElementById("run").value + 1 );
}
これは、プロパティがまたは要素value
にのみ適用できるために発生します。input
select
文字列値を数値に変換する必要があることに注意してください。変換しないと、文字列が連結されます。parseInt
またはparseFloat
関数を使用して実行できます。
var val = parseInt(document.getElementById("run").innerHTML, 10);
document.getElementById("run").innerHTML = ( val + 1 );
それは理由です:
document.getElementById("run").value
とにundefined
なりundefined + 1 == NaN
ます。
入力ボックスにはプロパティがありますが、 haveや。value
のようなノードがあります。<td />
.innerHTML()
.innerText()
また、注意してください'0' + 1 == '01'
。したがって、キャストも行う必要があります。
parseInt(document.getElementById('run').innerHTML, 10) + 1;
8進数として解釈される可能性のある文字列を変換するには、追加の基数-10が必要です:)
これを試して
function plus(){
document.getElementById("run").innerHTML = parseInt( document.getElementById("run").value) + 1;
}
この質問はまだより良い答えに値すると思いますが、間違っているかもしれません。)
関数で何が起こるかを確認しましょうplus
。まず、ID で要素を取得します。
var targetElement = document.getElementById('run');
これは実際にはDOMElement型のオブジェクトへの参照です。これは、nodeType プロパティを確認することで非常に簡単に確認できます。
if (targetElement.nodeType === 1) { alert("It's an element!"); }
DOM 要素には多くの優れたプロパティがありますが、それらnodeValue
は常に null に等しくなります。したがって、そのテキスト コンテンツを操作する場合は、子の textNodes を探すか、単にinnerHTML
プロパティを使用します。はい、文字列ですが、数値の場合、Javascriptはそれを通常の数値に変換します(私が覚えていることから、0は数値です:)。
したがって、plus
関数は実際には次のように記述できます (証明):
document.getElementById('run').innerHTML++;
属性値は常に文字列であり、JavaScript では文字列 + 1 は NaN であるためです。
これを解決するには、次を使用しますstring.toFloat()
。
function plus(){
document.getElementById("run").innerHTML = ( document.getElementById("run").value.toFloat() + 1 );
}
または使用parseInt()
:
function plus(){
document.getElementById("run").innerHTML = ( parseInt(document.getElementById("run").value) + 1 );
}
または、~~()
関数をトリックとして使用しますが、これは読み取り不能なソースになります。
はHTMLInputElementvalue
のプロパティであり、要素は ではなく であるため、そのプロパティはなく、次のようになります。TD
HTMLInputElement
HTMLTableCellElement
undefined + 1; // NaN - Not a Number
基本的にinnerHTML
、コンテンツの設定に使用したのと同じプロパティを使用して、コンテンツを取得することもできます。
function plus() {
// no need to execute `getElementById` twice
var td = document.getElementById("run");
td.innerHTML = +td.innerHTML + 1;
}
Number の値を変換するには、単項プラス演算子を使用しました。NaN
次のように、使用前かどうかを確認することもできます。
function plus() {
var td = document.getElementById("run");
var value = +td.innerHTML || 0;
td.innerHTML = value + 1;
}
その場合、NaN
(または 0 ですが、その場合は ID です) は 0 に設定され、カウントは1
エラーなしで開始されます。
さらに、サポートされている場合はtextContentプロパティを使用する方がよいと思いますが、すべてのブラウザーを処理するにはコードが少し複雑になり (たとえば、一部の IE バージョンではinnerText
代わりに使用する必要があります)、innerHTML
ほとんどの場合はうまくいく可能性があります。ケースの。