![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
下記のjavascriptでreturnの所は、実際は関数を削除したい所だが
方法が分からない。
関数を削除する理由は、もうキーを打鍵した時にこの処理は実行を
する必要が無い為。
下記にjavascriptのソースを示します。
$(function(){
1918行: questionsの配列
46行: indirectの配列
// indirectのベースと成る添字を求める
var prompt_q_count=prompt('Enter Number');
// indirectの配列を決める {{{
for (var i=0;i<indirect.length;++i){
indirect[i] = prompt_q_count - indirect[i] - 1;
} // }}}
// 本来のquestionsの配列から、indirectの要素から来るnew_questionsの配列を作る {{{
var new_questions=[];
for(i=0;i<indirect.length;++i){
new_questions[i]=questions[indirect[i]];
} // }}}
var q_count=0;
var q=new_questions[q_count];
$('#q').html(q);
$('input:visible').eq(0).focus();
$('input[type=text][name=a]').on('keyup',function(){
if(q_count>indirect.length - 1){
alert("end job");
return
}
var v=$(this).val()
var reg=new RegExp('^'+v);
var q_count2=q_count+1;
var lesson_data=q_count2+"/"+indirect[q_count]+"/"+questions.length;
$('#count').html(lesson_data);
$('#q').html(q);
if(v==""){
$('#res').html('');
}else if(q==v){
$(this).data('pre',v);
$('#res').html('complete');
$('input[type=text][name=a]').val('');
++q_count;
if(q_count>indirect.length - 1){
alert("end job");
return
}
q=questions[indirect[q_count]];
$('#q').html(q);
var q_count2=q_count+1;
var lesson_data=q_count2+"/"+indirect[q_count]+"/"+questions.length;
$('#count').html(lesson_data);
}else if(q.match(reg)){
$(this).data('pre',v);
$('#res').html('ok');
}else{
if(q.length>=v.length) $('#q').html(q.substr(0,v.length-1)+"<span style='color:red;font-weight:bold'>"+q.substr(v.length-1,1)+"</span>"+q.substr(v.length));
$(this).val($(this).data('pre'));
$('input[type=text][name=a]').val('');
$('#res').html('ng');
}
});
});
// # vim:set fdm=marker:
No.3ベストアンサー
- 回答日時:
#2です。
当初のご質問からはどんどん離れて行ってしまうような気がしてきましたが・・・
>今回の内容は、実はindirect.lengthと実際に問題を正当回答した回数を比較して、
>その回数がindirect.lengthを超えなければ匿名関数を実行する物です。
関数の内容(概念)を決め打ちせずに、その「ご説明通りの処理をする関数」をイベントリスナーとして設定すれば良いだけのように思えます。
バインドを外すとか、関数を削除するなどは手段の一つかも知れませんが、特にそのようなことをする必要もないのではないでしょうか。
例えば#2の例では、単純に1回実行すればフラグをセットするとしていますが、クロージャー的なフラグも必要なさそうなので、普通に条件分岐で処理する関数で十分ではないでしょうか?
有難う御座います。
私のスキル不足で、言っている事が良く理解をする
事が出来ません。
イベントリスナーを登録をするとか、クロージャーとかは
私には分かりません。
有難う御座いました。
一応、別の方法で、問題は解決をしていますので。
これで閉じさせて頂きます。
有難う御座いました。
No.2
- 回答日時:
#1です。
>イベントハンドラーで設定されている匿名関数を実行しない様
>にするにはどうすれば良いのかと言う事です。
それなら、「関数の削除」は直接は関係ないですね。
#1の後半が関係あることになります。
>removeEventListenerは使えないのでは無いでしょうか。
jQuery(?)のメソッドでbind処理を行うのなら使えませんが、自前でbind処理を行えばこの方法でも実現可能です。
とは言え、そんなことをしなくとも、#1で紹介しましたように、1回だけの処理とするメソッドが用意されていますので、そちらを利用するのが簡単でしょう。
http://api.jquery.com/one/
一回だけとは限らずに制御したい場合を想定してか、イベント処理の停止の仕組みも用意されているようです。
http://api.jquery.com/die/
>今現在は、苦肉の策で最後の処理は、location.reload()を使って
>最後の判定処理を行ない、その中で常にreturnをして実行させない
>様にしていますが。
実行したらフラグを立てるようにするだけでも、二回目以降の処理をスキップできますね。(自身を上書きしちゃうのもありそうですが…)
バインドを外してはいませんけれど、この方法も簡単な方法の一つと言えるでしょう。
自前でやるなら、以下のような仕組みでも可能です。
(クリックに1回だけ反応します)
$("#hoge").on("click", (function(){
var flag = false;
return function(){
if(flag) return; else flag = true;
// 実際の処理内容
alert("Event Listner!");
}
})());
有難う御座います。
今回の内容は、実はindirect.lengthと実際に問題を
正当回答した回数を比較して、その回数が
indirect.lengthを超えなければ匿名関数を実行
する物です。
ですから、匿名関数は何回も実行する事になります。
ここでは、イベント処理の停止に興味が有ります。
この場合は、どの様にコーディングをするのでしょうか。
よろしくお願いします。
No.1
- 回答日時:
こんにちは。
詳しいわけではありませんが。>関数を削除したい所だが方法が分からない。
なさりたいことがよくわかりませんが、ひとつの方法として関数を function(){;}; 等で上書きするという方法が考えられます。
削除とは異なりますが、実質的には同様ですし、nullなどで上書きするよりは、関数として動作する分だけ良いかもしれません。
完全に削除したいのであれば、deleteを利用することでできそうですが、ReadOnly や DontDelete属性が設定されている場合は削除はできないようです。
https://developer.mozilla.org/ja/docs/Web/JavaSc …
◇テストサンプル
func = function(){ alert("hoge"); }
console.log(func); //function func(){ alert("hoge"); }
func = new Function; // 上書き
console.log(func); //function anonymous(){}
alert(delete func); // true 削除
console.log(func); //func is not defined
とはいっても、ご提示のコードの中で関数らしきものはイベントハンドラで設定されている匿名関数しか見あたらないようなので、もしかすると、関数を削除するのではなく、イベントのバインドを外したいという意味の質問なのでしょうか?
もしそうであるなら、addEventListenerで登録した関数は、removeEventListenerで削除することが可能です。
https://developer.mozilla.org/ja/docs/Web/API/Ev …
さらには、質問文に書いてないけれど、jQuery利用のようなので、1度だけ実行するように設定するone()メソッドを利用するという方法もあるのかも知れません。
http://api.jquery.com/one/
(jQueryで内部処理をどのようにしているのかは確認していません。)
有難う御座います。
イベントハンドラーで設定されている匿名関数を
実行しない様にするにはどうすれば良いのかと
言う事です。
質問が分かり辛くて済みません。
今回の匿名関数と言うのは、addEventListenerとは
関係が無いと思うので、removeEventListenerは
使えないのでは無いでしょうか。
今現在は、苦肉の策で最後の処理は、location.reload()
を使って最後の判定処理を行ない、その中で
常にreturnをして実行させない様にしていますが。
これが本来のやり方なのかは分かりません。別の方法が
有る様に思いますが。
済みません。指摘をお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
JAVAスクリプトで指定時間以降...
-
関数でy=g(x)のgとは何の略です...
-
シューティングゲームの作り方
-
idを使わずにonclickで自身の要...
-
jQueryの"return false"の役割...
-
クリックすると上に開くアコー...
-
関数の中の値を取り出したい
-
マウスをのせてながら、2秒後に...
-
同じIDで定義した要素の配列を...
-
<a>タグのテキストを取得
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
C#テキストボックスの文字を配...
-
window.openでタイトル名の指定
-
ActiveXobjectが作成できない
-
クリッカブルマップのリンク部...
-
undefinedを表示させない方法は...
-
Vb.netのグローバル変数の宣言...
-
googleスプレッドシートのApps ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数でy=g(x)のgとは何の略です...
-
idを使わずにonclickで自身の要...
-
functionから別のfunctionを実...
-
jslintのエラーについて質問
-
要素名がスペースを含む場合のj...
-
javascript(jQuery)でセル内...
-
ajax反映後のjqueryが動かない
-
jQueryの :not() .not() が有効...
-
getElementByIdを使用したグロ...
-
コードをスマートにさせたい。
-
クリックすると上に開くアコー...
-
jQueryの"return false"の役割...
-
jQueryが読み込めない
-
個別では動く、javascriptのエラー
-
一つのアクションで関数を二つ...
-
jqueryの変数を関数の外に出す方法
-
R言語
-
jQuery|:not(:animated)
-
即時関数でプライベート変数的...
-
スムーズに動く アニメーション...
おすすめ情報