
Food=0;
Drink=0;
<SELECT onchange='Food=this.value; calc();'>
<OPTION value=1>パン</OPTION>
...
</SELECT>
<SELECT onchange='Drink=this.value; calc();'>
<OPTION value=1>水</OPTION>
...
</SELECT>
function calc(){
totalPrice = Price[Food]+Price[Drink];
alert(totalPrice);
}
として一旦グローバル変数に入れて計算するのと
<SELECT id='Food' onchange='calc();'>
<OPTION value=1>パン</OPTION>
...
</SELECT>
<SELECT id='Drink' onchange='calc();'>
<OPTION value=1>水</OPTION>
...
</SELECT>
function calc(){
totalPrice = Price[document.getElementById['Food'].value]+Price[document.getElementById['Drink'].value];
alert(totalPrice);
}
getElementByIdで指定して呼び出して計算するのではどちらのほうが処理が早くなりますか?
No.6ベストアンサー
- 回答日時:
ブラウザによりますが、少なくともIE6では getElementById は ページ内のid数に
ほぼ正確に速度が反比例します。キャッシュも効きません。
id がページ内に数千個あると、下記のハッシュに比べ getElementById の速度は
数十分の 1 になります。
ページに id がたくさんある場合で、getElementById を使いたいなら、
下記ハッシュを使うことをお勧めします。
var idHash = {};
var all_Nodes = document.getElementsByTagName('*');
var node_count = all_Nodes.length;
for (var i = 0; i < node_count; i++) {
var node_ref = all_Nodes[i];
var node_id = node_ref.id;
if (node_id) {
idHash[node_id] = node_ref;
}
}
としておいて
idhash[XXXXXXXX]
とアクセス。これだけ。
No.5
- 回答日時:
質問文の2つ目は getElementById のプロパティアクセス演算子が働くので、1つ目のほうが若干速いと思います。
最速を求めるなら泥臭いですが、関数を使わない方向に。プロパティアクセス演算子の使用回数を極限まで減らしてします。
http://jsfiddle.net/HNCGE/
ところでこれ、Number型に型変換していないのは期待通りでしょうか?
質問文では型変換していなかったのでそれに追従しましたが、必要なら Number() を通してください。
http://jsfiddle.net/HNCGE/1/
---
汎用性を重視するなら、#3 さんの方法を推奨。
this.value を使わず、this.form.elements を通すのでプロパティアクセスの回数は増えますが、HTMLはすっきりします。
速度と汎用性、どちらを重視するかは好みの問題だと思います。
バランス感覚のようなもので人それぞれ違います。
個人的には拡張性も考えて http://jsfiddle.net/HNCGE/2/ のようにするかな…。
for-in にするかは迷いどころですが、目的によってコードも変わってきそうです。
No.4
- 回答日時:
[ANo.2] を撤回して、[ANo.3] さんに一票。
質問内に form 要素が書かれていなくて、回答に、含めるかどうか迷ったけど、やっぱり form 要素を含めて、function calc() を記述したほうがきれいに書けるね。
No.3
- 回答日時:
<form action="#">
<p>
<select name="Food" onchange="calc(this);">
<option value="1">パン</option>
</select>
<select name="Drink" onchange="calc(this);">
<option value="1">水</option>
</select>
</p>
</form>
var Price = [, 100];
function calc(select){
var controls = select.form.elements;
var food = Price[controls['Food'].value];
var drink = Price[controls['Drink'].value];
var totalPrice = food + drink;
alert(totalPrice);
}
・一般に JS のグローバル変数は遅い。
・一般に JS の関数呼び出しは遅い。
・一般に JS のプロパティアクセスは遅い。
・form 内の name は、その form 内に限定されます(ID をまき散らさない)。
・フォーム部品は、自身が属する form を参照できます。
・form は、自分に属する全フォーム部品を elements に格納しています。
値の妥当性はチェックしていませんのであしからず。
No.2
- 回答日時:
2つのハイブリッドを薦めてみる。
重視したのは、2点。
* 使う必要のないグローバル変数を使わない。
* function calc() は、要素の値を気にしない。
<SELECT id='Food' onchange='calc(this.value,document.getElementById('Drink').value);'>
<OPTION value=1>パン</OPTION>
...
</SELECT>
<SELECT id='Drink' onchange='calc(document.getElementById('Food').value,this.value);'>
<OPTION value=1>水</OPTION>
...
</SELECT>
function calc(food,drink){
totalPrice = Price[food]+Price[drink];
alert(totalPrice);
}
ちなみに、Food と Drink が同じ配列 Price[] から値段をとってるから、
実際には、↓かな?
totalPrice = FoodPrice[food]+DrinkPrice[drink];
No.1
- 回答日時:
id に関してはDOM 構文上でHashMap にキャッシュされてると思われるので、さほど速度差は無いと思われます。
が・・・これは最近のブラウザの実装について言える希望的観測なので、正確にはループさせて計測してみては?
でもまぁJQuery でやってる事よりははるかにシンプルな記述ですし、実用速度面では問題にならないでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
- JavaScript 中百舌鳥駅と深井駅を入れ替えて選択しても同じ挙動にしたいです。 2 2022/06/24 18:45
- JavaScript 1度きりではなく、繰り返し、挙動が変わるようにしていただきたいです。 1 2022/07/03 15:50
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プルダウン 項目が多いので先頭...
-
Selectボックスの幅を自動で広...
-
どちらのほうが処理が早いか
-
プログラムがうまく動きません...
-
【javascript・PHP】プルダウン...
-
IDの取得、繰り返しに問題があ...
-
フォームで開始時間と終了時間...
-
CSVファイルを読みこみ、プルダ...
-
onchange等のイベントハンドラ...
-
JavaScriptでのセレクトボック...
-
return trueとreturn falseの用...
-
【jQuery】input nameの文字列...
-
onchangeイベントを強制的に発...
-
ctrl+vを無効にする方法
-
ツリービューのチェックボック...
-
<JavaScript>tableタグを入力不...
-
チェックボックス付きのテーブ...
-
JavaScriptのfileオブジェクト...
-
特定<table>内の<td>の色を変える
-
<input>の選択肢をプルダウンメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プルダウン 項目が多いので先頭...
-
Selectボックスの幅を自動で広...
-
jQuery セレクトボックスで選択...
-
JQuery selectが反映されない
-
CSVファイルを読みこみ、プルダ...
-
現在時刻を取得してフォームのs...
-
Selectの中身をfor文で入れる
-
selectメニューのselectedの位...
-
UWSCのIE操作でプルダウンを選...
-
【javascript・PHP】プルダウン...
-
フォームのメニューリストを外...
-
ブラウザの戻るボタンを押した...
-
javascriptでselectボックスの<...
-
onchange等のイベントハンドラ...
-
JavaScriptでプルダウンのサイ...
-
フォームで開始時間と終了時間...
-
リストボックスの項目の順番を...
-
リロード時もコンボボックスの...
-
セレクトメニューで選択された...
-
selectタグに直接onChangeを書...
おすすめ情報