minifyされたJavaScriptにconsole出力等の処理を挟む、特定経路を通った場合に処理を挟む
minifyされたJavaScriptへのブレークポイントでの処理の挟み込み
Firebugのブレークポイントは行に貼るのでminifyされたJavaScriptと相性が悪い。
例えばjQuery.ajaxが定義されている行にFirebugで元のJavaScriptのコードに手を入れずにdebug用のconsole出力を入れる方法 - 文殊堂の要領でconsole出力を挟んだとして、
無関係な関数の呼び出しまで対象になってしまう。
それを回避するためにブレークポイントに設定する条件を変えてみる。
!(!(arguments.callee === jQuery.ajax) || (/* やりたい事(式)をカンマ区切りで start */console.info(arguments.callee.toSource())/* end */,true))
コピペ用
!(!(arguments.callee === jQuery.ajax) || (console.info(arguments.callee.toSource()),true))
これを使うと||前の条件が満たされた場合のみ、||後の挟み込まれた処理が実行され、
なおかつ全体としては必ずfalseになるのでブレークはしない。
この場合だと呼び出された関数がjQuery.ajaxの場合に限定して処理を挟み込むことができた。
特定経路で呼び出された場合に限定したブレークポイントでの処理の挟み込み
例えばこの関数での$.ajaxの呼び出しに処理を挟み込む
function post_call_api(url,data){ $.ajax({ type: 'POST', url: baseuri+url, timeout: 10000, data: data, beforeSend: function(){ if(elm = $(".post_box input[type=submit]")[0]) elm.disabled = true; }, error:function (){ alert("失敗しました。時間を置いてから再度お試しください。"); if(elm = $(".post_box input[type=submit]")[0]) elm.disabled = false; }, success:function (text){ if(text != parseInt(text)){ this.error(); }else{ location.href = baseuri+'/li/'+text; } } }); }
jQuery.ajaxの呼び出し直前に呼び出し元にブレークポイント条件で処理を挟む
__cond = true,false
jQuery.ajaxが定義されている行には以下のようなブレークポイント条件を設定する。
!(!(typeof __cond !== 'undefined' && __cond) || (__cond = false,/* やりたい事(式)をカンマ区切りで start */console.info(arguments)/* end */,true))
コピペ用
!(!(typeof __cond !== 'undefined' && __cond) || (__cond = false,console.info(arguments),true))
呼び出し元を通った場合に条件として使用するグローバル変数__condがtrueになるようにし、
後は一つ目の場合の変形版で、呼び出し先では__condがtrueでないと挟み込まれた処理は実行されないようにする。
で、なおかつ、挟み込まれた処理の中で__condをfalseにしておく。
引数べた書きの関数呼び出しの引数の改ざん
例えば上の例でsuccess callbackを改ざんする。
argumentsは普通に触れるんだから、やりたい事の中に↓みたいのを入れればおk。
arguments[0].success=function(text){console.info(text);}
なのでブレークポイント条件はこうすれば良い。
!(!(typeof __cond !== 'undefined' && __cond) || (__cond = false,arguments[0].success=function(text){console.info(text);},true))
こんな事が出来て何が嬉しいのか
optionsを変数として切り出したり、処理を関数として切り出したりしないで、
$(document).readyでAjaxやってるようなコードをdebugするときとかはわりと嬉しい。