【jQuery】カスタムイベントと.on()

このQ&Aのポイント
  • カスタムイベントの作成(bind)と初期着火の方法について
  • ajaxで作成された要素におけるカスタムイベントの動作について
  • 解決策を求めて試行錯誤しているが解決できない
回答を見る
  • ベストアンサー

【jQuery】カスタムイベントと.on()

お世話になります。 題名の通りなのですが、どうにも上手く動きません。 1.カスタムイベントの作成(bind)と初期着火 $(element).on('myEvent', function() {  $(this).myPlugin(); }).trigger('myEvent'); 2.ajaxで作成された要素に(.live()) $(document).on('myEvent', '.myClass', function() {  $(this).trigger('myEvent'); } ); 1は問題なく期待した通り動作します。 2は、まったく動きません。 ※myPluginは有名なjQueryプラグインです。 それぞれをチェーンで繋いでみたり、セレクターを変えてみたりと試しているのですが、 どうにも解決できないので、お知恵をお貸し下さい。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

回答をさせていただくにあたり、2の状況で期待する動作が、 ・ajaxで動的に要素が複数生成される ・生成された複数の要素に、カスタムイベント(myEvent)が設定される ・各要素の生成と同時に、カスタムイベント(myEvent)が発生する と考えさせていただきました。 結論から申し上げると、 onを使ったカスタムイベントの指定ですと 初期着火は難しいのが現状かと思います。 代替案としましては、 http://blog.mach3.jp/2010/12/element-on-ready-by-jquery.html こちらのURLが参考になるかと思いますが、 要素の追加と同時にその要素にイベントを設定する形で実現できるのではないかな・・・ と思います。 下記、ご提示いただいていたスクリプトの私なりの所見です。 1のスクリプトにおいてはチェーンにより、 ○elementにカスタムイベント(myEvent)を設定 ↓ ○trigger('myEvent')によりカスタムイベント(myEvent)が発生 ↓ ○$(this).myPlugin();を実行 という流れで処理が行われますので、 カスタムイベントの設定後すぐに、カスタムイベントが発生するようになります。 2のスクリプトにおいては、 $(this).trigger('myEvent'); で、着火させる形ではないかとお見受けするのですが、 現状ままですと、 ○.myClassを持った要素が追加されると同時にカスタムイベント(myEvent)が設定される。 といったところまでで、処理がストップしてしまっています。 また、現状の$(this).trigger('myEvent');の位置ですと、 ○myEventが発生した場合に、$(this).trigger('myEvent');が実行される。 というような挙動になってしまうかと思います。 ですので、 $(document).on('myEvent', '.myClass', function() { $(this).trigger('myEvent'); } ); $('.myClass').trigger('myEvent'); というように、トリガを別途指定してあげれば、トリガ自体は発生するかと思うのですが、 この形だとmyEventが無限ループしてしまいます。。 以上になります。 何卒よろしくお願いします。

__house
質問者

お礼

blue-goheimochi様 丁寧かつ、分かりやすいご説明、大変参考になりました。ありがとうございます! 「2の状況で期待する動作」については、御察しの通りでございます。 > 要素の追加と同時にその要素にイベントを設定する形で実現できるのではないかな・・・ 上記の考え方の元、ソースを見直しました。 結果として、 jQuery(function($) { function myEvent() { $(".myClass").myPlugin(); } myEvent(); $.ajax(…).done(myEvent()); }); 実際にajaxで更新している部分へ.done()メソッドを付け、ajaxで追加更新された要素に対して'myEvent'を実行する事で、一応の期待した動作を確保しました。 カスタムイベント難しいです。。

__house
質問者

補足

.on()を使った方法のアイデアを引き続き募集します。 よろしくお願いいたします。

関連するQ&A

  • jQuery mobileのイベントについて

    jQuery mobile 1.0で使えていたイベントが1.1.1で使えなくなりました。 何か仕様が変わったのでしょうか? よろしくお願いします。 例: $("div:jqmData(role='collapsible')").each(function(){  // ここが機能しなくなった bindEventTouch($(this)); }); function bindEventTouch(element) { element.bind('tap', function(event, ui) { if(element.hasClass('ui-collapsible-collapsed')) { } else { $('#' + element.attr('id') + 'l li').remove(); $('#' + element.attr('id') + 'l').append("<li>I'm Header #FF</li>"); } }); }

  • jQueryプラグインでfn指定しないのはどんな時

    ■質問1 ・jQueryプラグイン内で、jQuery.fn.hoge = function() {と書くと、jQuery(指定セレクト要素).hogeでメソッド実行できるみたいですが、逆にプラグイン内で、jQuery.hoge = function() { と書くのはどんな時なのでしょうか? セレクタで呼び出さないとき? ■質問2 ・「jQuery.fn.extend」「「jQuery.extend」は、上記とはまた別の話なのでしょうか?

  • jQuery の one 関数について

    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

  • jQueryで要素を複製するプラグインの作成

    jQueryのプラグインを作成しています。 やりたいことは、追加ボタンをクリックしたら、指定要素を複製していくというものです。 下記のようにプラグインを作成しましたが、 なぜか要素(clone_base1)が消えてしまいます。 原因もわからず困っています。 どのようにしたらよいのでしょうか。 (function(jQuery) { jQuery.fn.clone = function(options) { //defaultの値 var options = jQuery.extend({ reset_form: true ,clone_base : "clone_base1" }, options); return this.each(function() { jQuery(this).click(function(){ //元となるボックスを複製 jQuery("."+options.clone_base).clone().appendTo("."+options.clone_base); }); }); }; })(jQuery);

  • jQueryが動きません。

    表題のとおりです。 fademover(http://www.detelu.com/fademover/)を動かそうと思って 導入しても動いてくれません。 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script src="jquery.fademover.js"></script> <script> $(function(){ $('body').fadeMover({'effectType': 2,'inSpeed': 5000}); }); </script> の部分。 Chromeだと Uncaught TypeError: Object [object Object] has no method 'fadeMover' index.html:14 (anonymous function) index.html:14 n ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js:2 o.fireWith ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js:2 e.extend.ready ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js:2 c.addEventListener.B Safariだと TypeError: 'undefined' is not a function (evaluating '$('body').fadeMover({'effectType': 2,'inSpeed': 5000})') と出ます。 jsやjqueryはあまりいじったことないので 手が出ない状態です。 よろしくお願いします。

  • jquery の clickイベント

    いつもお世話になっております。 当方jQueryは初めてで試行錯誤しながら使っています。 標題について質問です。 <form> <input type="text" id="code[1]" value="00001"> <input type="submit" id="add[1]"> <input type="submit" id="del[1]"> </form> 上記のフォーム文で、 jQuery.noConflict(); jQuery(document).ready(function($){ $("input").click(function(){     var e = $(this).attr("id");     }); }); とし、上のform文を直接書いた場合は押されたボタンが認識されるのですが、 form文をajax通信でinnerHTMLで出力されたボタンを押した時は ボタンを押してもイベントを認識してくれません。 これはinnerHTMLで出力しているからなんでしょうか。 何度やっても分からず質問させて頂きました。 以上、宜しくお願い致します。

  • onの用法

    wordpressにカスタムフィールドテンプレートというプラグインを使って、投稿ページにjsで生成されたformやinputの要素を操作したいというのが趣旨です。 テンプレートを読み込む(jsでフォーム類が生成)されるのはボタンを押してから数秒かかります。 下記のようなソースを設置しましたが、1はコンソールに出てきますが、2がでてきません(その下の2つも勿論反応しない)。 (ソースのクラス名は例) jQuery(function($){ $(document).on('click','input.setting',function(){ console.log("setting!");//1 }); $(document).on('load','input.radio1',function(){ console.log("check!");//2 $('input.radio1').prop("checked", "checked"); $('input.radio1').addClass("testClass"); }); }); jquery1.11.1、WP4.1、プラグイン2.1です。 よろしくご教授お願いします。

  • jQuery 階層セレクタとフォームセレクタの混在

    いつもお世話になります。 jQueryで、階層セレクタにフォームセレクタを使用すると、一部思うように動作しないセレクタがあります。動作しないのは、例えば以下のセレクタです。 HTML ------ <div id="div1"></div> <input type="hidden" name="hdn0" value="h1" /> <input type="hidden" name="hdn1" value="h2" /> ----- jQuery ----- $(function() { var obj = $("#div1"); alert($("~ input:hidden[name='hdn0']", obj).val()); alert($("~ input:hidden[name='hdn1']", obj).val()); }); ----- 上記のセレクタは、階層セレクタで 「prev ~ siblings」 のsiblingsを、フォームセレクタの:hiddenを指定しているのですが、この:hiddenが効いてないみたいなのです。 (:hiddenを外せばとれます) 自分なりに調べてみて、siblingsにはセレクタを指定することができると思っています。 しかしこの認識は間違っているのでしょうか。 宜しくお願いします。 jQuery:1.7.2 (https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.jsを使用)

  • jqueryのロールオーバーについて

    jqueryのロールオーバー設定に関してご質問です。 あるサイトのコーディングを行ってます。 サイト内のナビーゲーションボタンを瓶の画像でまとめてます。 各瓶の画像にリンクを付け、 マウスを乗せるとその瓶が開いた画像が 切り替わりでフェードインの感じで出てくるという設定を目指しているのですが、 うまくいきません。 色々やった結果マウスを当てると、 切り替わりで空いた瓶がフェードで出るのですが、 その画像奥に閉じた瓶がそのまま残ってて重なってる感じです。 こちらはどのようにすれば上手く画像奥の瓶は消えるのでしょうか? ちなみに画像はpngです。 フェードの切り替わりは是非そのまま使用したいと考えてます。 あとマウスを外せばまた閉じた瓶がフェードで出るという感じを目指してます。 どなたかご教示いただいてもよろしいでしょうか? 一応下記htmlとjsコードも載せておきます。 ▼html <script src="../lib/jquery1.8.1.min.js"></script> <script src="../js/jquery.tgImageRollover.js"></script> <script type="text/javascript"> jQuery(function(){ $(this).tgImageRollover({ selector : 'img.rollover', // セレクタ ←(7) attach : '_on', // ファイル名末尾句 ←(8) onFadeTime : 600, // カーソルON時のアニメーション時間 ←(9) offFadeTime : 400 // カーソルOFF時のアニメーション時間 ←(10) }); }); </script> <a href="#"><img class="rollover" src="../img/nav01.png" alt="" width="100" height="50"></a> <a href="#"><img class="rollover" src="../img/nav02.png" alt="" width="100" height="50"></a> ▼jquery.tgImageRollover.js ;(function($){ $.fn.tgImageRollover = function(options){ var opts = $.extend({}, $.fn.tgImageRollover.defaults, options); $(opts.selector).each( function(){ this.onImage = $(this).attr('src').replace(/^(.+)(\.[a-z]+)$/,"$1"+ opts.attach +"$2"); this.onHtml = $('<img src="'+this.onImage+'" alt="" style="position:absolute; opacity:0;">'); $(this).before(this.onHtml); $(this.onHtml).hover( function(){ $(this).stop().animate({'opacity': '1'}, opts.onFadeTime); }, function(){ $(this).stop().animate({'opacity': '0'}, opts.offFadeTime); } ) } ) } // default option $.fn.tgImageRollover.defaults = { selector : 'img.rollover', attach : '_on', onFadeTime : 600, offFadeTime : 400, }; })(jQuery);

  • CakePHPでjQueryを使うには

    ローカル環境にてCakePHPでwebサービスを制作しています。 ブラウザでviewを確認しながら構築しているのですが、この環境でgoogleAPIのjQueryを動作させることは出来るのでしょうか? もしできるとしたら、 <?php echo $this->Html->script('http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js');?> <script type="text/javascript"> jQuery('#more').click(function(){$('innerboxes').clone().appendTo('box')}); </script> で動かないのは何が問題なのでしょうか? また、googleAPIを使わない方法でも以下のように試しましたが、これも動かない原因はどこにあるのでしょうか? jQueryのホームページでver1.5のソースをコピーし作ったjQuery1.5.jsを、 webroot /jsに入れる。 Controllerに var $helpers=array('Ajax','Javascript'); を記述。 Viewに、 <?php echo $javascript->link('jQuery.1.5.js'); ?> <script type="text/javascript"> jQuery('#more').click(function(){$('innerboxes').clone().appendTo('box')}); </script> 宜しくお願いします。

専門家に質問してみよう