質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1601閲覧

'y','n'の2つの値を持つ変数の値の切り替えをグローバル変数を使わずに管理したいのですが・・・

true

総合スコア440

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/07/12 10:10

いつもありがとうございます。同じような質問を続けてしまって恐縮です。

3*3のテーブルを生成し、矢印キーによるセル間の移動を許可しつつ、F2キーを押した場合はセル間の移動を禁止し、再度F2キーを押した場合は再びセル間の移動を許可するというスクリプトを組みました。しかし、悪戦苦闘したあげく、結局グローバル変数に頼ってしまいました。これを関数内で定義して管理できるはずなのですがまだ良くわかりません。ご教示のほど、よろしくお願いいたします。

ブラウザ chrome バージョン 43.0.2357.130 (64-bit)

lang

1<html> 2<head> 3<script type="text/javascript"> 4window.onload = setTable; 5 6function setTable() { 7 var out = "<table id='tb' border='1' align='center'>"; 8 for (var i=0; i<3; i++) { 9 out += "<tr>"; 10 for (var j=0; j<3; j++) { 11 out += "<td><input value='"+i+"/"+j+"' onkeydown='moveCell(event, this);' /></td>"; 12 } 13 } 14 document.getElementById("result").innerHTML = out; 15} 16 17// 矢印キーによるセル間の移動を許可するかどうかを監視するグローバル変数(初期値は許可) 18var mv = 'y'; 19 20function moveCell(e, t) { 21 // var mv = 'y'; // 本当は関数内で定義し、'y', 'n' の切り替えをしたいが・・・ 22 var k = e.keyCode; 23 var row = t.parentNode.parentNode.rowIndex; 24 var col = t.parentNode.cellIndex; 25 if ( mv == 'y') { 26 switch (k) { 27 case 37: 28 col = col - 1; 29 tb.rows[row].cells[col].childNodes[0].focus(); 30 break; 31 case 38: 32 row = row - 1; 33 tb.rows[row].cells[col].childNodes[0].focus(); 34 break; 35 case 39: 36 col = col + 1; 37 tb.rows[row].cells[col].childNodes[0].focus(); 38 break; 39 case 40: 40 row = row + 1; 41 tb.rows[row].cells[col].childNodes[0].focus(); 42 break; 43 case 113: // F2キー 44 mv = 'n'; 45 break; 46 } 47 } else if (k == 113 && mv == 'n') { 48 mv = 'y'; 49 } 50} 51</script> 52<body> 53<div id="result"></div> 54</body> 55</html> 56

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんなのはどうでしょうか。
あんまりjavascript書かないんですが、クロージャというんですかね。関数を定義した時の変数を参照する方法で、定義した変数は関数からは見れますが、関数定義後に変数はスコープ外になるので、見えなくなります。

lang

1var moveCell = function(){ 2 var mv = 'y'; 3 return function(e, t){ 4 var k = e.keyCode; 5 var row = t.parentNode.parentNode.rowIndex; 6 var col = t.parentNode.cellIndex; 7 if ( mv == 'y') { 8 switch (k) { 9 case 37: 10 col = col - 1; 11 tb.rows[row].cells[col].childNodes[0].focus(); 12 break; 13 case 38: 14 row = row - 1; 15 tb.rows[row].cells[col].childNodes[0].focus(); 16 break; 17 case 39: 18 col = col + 1; 19 tb.rows[row].cells[col].childNodes[0].focus(); 20 break; 21 case 40: 22 row = row + 1; 23 tb.rows[row].cells[col].childNodes[0].focus(); 24 break; 25 case 113: // F2キー 26 mv = 'n'; 27 break; 28 } 29 } else if (k == 113 && mv == 'n') { 30 mv = 'y'; 31 } 32 } 33}();

投稿2015/07/12 14:42

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

true

2015/07/13 12:45

ありがとうございました。return functionの入れる場所とか、変数に関数を代入するとか、徐々に理解を進めていきたいと思います!非常に役に立ちました!Good Partsにも関数はなるべく変数に代入してから使いなさい的なことが書かれていますしね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問