ショボ短歌会

下記の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:

A 回答 (3件)

#2です。



当初のご質問からはどんどん離れて行ってしまうような気がしてきましたが・・・

>今回の内容は、実はindirect.lengthと実際に問題を正当回答した回数を比較して、
>その回数がindirect.lengthを超えなければ匿名関数を実行する物です。
関数の内容(概念)を決め打ちせずに、その「ご説明通りの処理をする関数」をイベントリスナーとして設定すれば良いだけのように思えます。

バインドを外すとか、関数を削除するなどは手段の一つかも知れませんが、特にそのようなことをする必要もないのではないでしょうか。
例えば#2の例では、単純に1回実行すればフラグをセットするとしていますが、クロージャー的なフラグも必要なさそうなので、普通に条件分岐で処理する関数で十分ではないでしょうか?
    • good
    • 0
この回答へのお礼

有難う御座います。

私のスキル不足で、言っている事が良く理解をする
事が出来ません。

イベントリスナーを登録をするとか、クロージャーとかは
私には分かりません。

有難う御座いました。

一応、別の方法で、問題は解決をしていますので。
これで閉じさせて頂きます。

有難う御座いました。

お礼日時:2017/11/27 20:21

#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!");
 }
})());
    • good
    • 0
この回答へのお礼

有難う御座います。

今回の内容は、実はindirect.lengthと実際に問題を
正当回答した回数を比較して、その回数が
indirect.lengthを超えなければ匿名関数を実行
する物です。

ですから、匿名関数は何回も実行する事になります。

ここでは、イベント処理の停止に興味が有ります。
この場合は、どの様にコーディングをするのでしょうか。

よろしくお願いします。

お礼日時:2017/11/27 16:27

こんにちは。

 詳しいわけではありませんが。


>関数を削除したい所だが方法が分からない。
なさりたいことがよくわかりませんが、ひとつの方法として関数を 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で内部処理をどのようにしているのかは確認していません。)
    • good
    • 0
この回答へのお礼

有難う御座います。

イベントハンドラーで設定されている匿名関数を
実行しない様にするにはどうすれば良いのかと
言う事です。

質問が分かり辛くて済みません。

今回の匿名関数と言うのは、addEventListenerとは
関係が無いと思うので、removeEventListenerは
使えないのでは無いでしょうか。

今現在は、苦肉の策で最後の処理は、location.reload()
を使って最後の判定処理を行ない、その中で
常にreturnをして実行させない様にしていますが。

これが本来のやり方なのかは分かりません。別の方法が
有る様に思いますが。

済みません。指摘をお願いします。

お礼日時:2017/11/27 11:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!