dポイントプレゼントキャンペーン実施中!

jQuery の one 関数は便利だと思い、是非作ってみようと思いましたが、全然出来ません><
一応以下のように作ってありますが、正しく動作しない上に、name を指定して、 Listener.data オブジェクトにname で保存をするようになっていて、同じnameを渡したら上書きされてしまいます。
どうしたら、jQueryのような、one関数を作れるでしょうか?;;
var Listener={
addEvent:function(element,type,callback,useCapture){
if(element.addEventListener){
return element.addEventListener(type,callback,useCapture);
}
else if(element.attachEvent){
return element.attachEvent('on'+type,callback);
}
else{
return element['on'+type]=callback;
}
},
removeEvent:function(element,type,callback,useCapture){
if(element.removeEventListener){
element.removeEventListener(type,callback,useCapture);
}
else if(element.detachEvent){
element.detachEvent('on'+type,callback);
}
else{
return false;
}
return true;
},
addOne:function(name,element,type,callback,useCapture){
Listener.addEvent(element,type,callback,useCapture);
Listener.addEvent(element,type,function(){
Listener.removeEvent(element,type,);
},useCapture);
this.data[name]=new Function("Listener.removeEvent("+element+",'"+type+"',Listener.data['"+name+"'],"+useCapture+");+callback);
this.addEvent(element,type,this.data[name],useCapture);
},
data:{
}
};

addEventとremoveEventは正常動作しています。
現在は、
Listener.addOne('name'/*指定しなくてもいいようにしたい*/,'document'/*オブジェクトを渡すと、elementがobjectになり、未定義エラーに*/,function(){alert('OK');},true);
となっていますが、目指すは以下のような書き方です。

//仮関数定義
function test(str){
alert(str);
}
var str='test';
Listener.addOne(document,function(str){test(str);},true);

です。

一応、jQueryのone関数を見てみましたが、jQueryは使ったことが無く、あまり分かりませんでした;;
御回答宜しくお願いしますm(_ _)m

A 回答 (1件)

よくわかってませんが…



・質問文中「callback」と書いてあるのは、function(←このままじゃまずいけど)のことでは?
・addEventで値をreturnしていますが、戻り値は常にtrueみたいなので、意味があるのだろうか?(未確認です)
・addEventに『element['on'+type]=callback;』があるけれど、removeEventのほうにはこれに対応したものがないのはなぜ?(そもそもこの部分は必要なのかどうか・・・?)


などという揚げ足取りは置いておいて・・・
addOne : function(element, type, func, useCapture) としたときに
addEventで並列にイベントのバインドとデタッチを定義しようとしているみたいですが、定義の順序と実行順って(同じと)保証されているんでしたっけ?(不確定だったような・・・未確認です)
なので、『 func実行後にremoveする 』関数をaddEventするのがよいのでは?

addOne : function(element, type, func, useCapture){
 Listener.addEvent(element, type, function(){
  func();
  Listener.removeEvent(element, type, arguments.callee, useCapture);
 }, useCapture);
}


あと、蛇足ですが
>var str='test';
>Listener.addOne(document,function(str){test(str);},true);

strがグローバルで、それを参照するなら function(){ test(str): } では?
任意の引数を渡したいのなら
 (function(a){return function(){test(a)};})("other value") とか?
    • good
    • 0
この回答へのお礼

arguments.call!!
こんなんがあったんですねb
初めて知りました;;
おかげで、完成しました^^
また、ご指摘くださった部分も修正して、完成しました^^
本当にありがとうございましたm(_ _);

お礼日時:2011/03/09 00:18

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


このQ&Aを見た人がよく見るQ&A