2016-04-25 4 views
-1

私はいくつかのhtmlで次のJavaScriptを持っています。デモのサンプルは次のURLにあります:http://js.do/sun21170/92329JavaScriptまたはjQueryの関数の最後に動的にコードを追加します

私の野心的な目標はの部分の直後にdoSomethingの機能の一部を実行することです。 私はを使用しているライブラリにあるので、この関数の中身は何も制御していませんが、最後のコード行がこの関数で実行された後にいくつかのコードを実行します。だから、doSomething関数の最後にJavaScriptコードを動的に挿入したいのと同じです。

質問doSomethingのコードの最後の行の後にコードを動的に挿入することはできますか?はいの場合はどうすればよいですか?

たとえば、カスタムコードの次の行を挿入したいとします。alert(val);または変数にアクセスしていない場合は、alert("hello");のような他のカスタムコードを挿入します。私はコールバック関数の本体を取得しようとし、私は私の新しいコードを追加することができると思うが、まだ私の非常に一般的な要件を実装することはできません。

<button type="button" onclick="callback(200);">Callback gets called </button> 
<script> 
var callback = null; 
//the function below cannot be changed 
function doSomething(val) { 
    if (val > 150) { 
     alert("You are not eligible for this reward"); 
    } else { 
     alert("Congrats! You have just been rewarded"); 
    } 
} 


//set callback to something 
callback = doSomething; 

//I want to automatically execute some code when callback finishes execution without 
//having to explicitly write that code within the doSomething function OR 
//writing code after doSomething function is called in onclick function of button 
//If this is possible, HOW WOULD I IMPLEMENT THIS? 


//I can get the body of a function using below code 
function getCallBackBody(callbackFunction) { 
    var entire = callbackFunction.toString(); 
    var body = entire.substring(entire.indexOf("{") + 1, entire.lastIndexOf("}")); 
    return body; 
} 
</script> 
+1

あなたが関数内の変数にアクセスする必要があるので、あなたはこれをやっていますか?あるいは、関数の後に*コードを実行したいだけですが、その関数の呼び出しを変更する必要はありません。 – James

+0

@James、元のコールバックの最後の行が終了したときにカスタムコードを正確に実行したいので、これが必要です。したがって、メソッド内の変数にアクセスする必要はありません。私はこの余分な説明を私の元の質問に加えました。それをもっと詳細にしてくれてありがとう。 – Sunil

+1

いいえ、これは不可能です。ただし、プラグイン/ライブラリが使用しているものを上書きできるように、その関数が格納されている場所にアクセスできる場合は、その関数を置き換える/ラップすることができます。 –

答えて

1

doSomethingをdoSomethingを呼び出してコードを呼び出す関数に置き換えることができます。 doSomethingが最初に定義されていることを確認します。

function doSomething(val) { 
 
    if (val > 150) { 
 
    alert("You are not eligible for this reward"); 
 
    } else { 
 
    alert("Congrats! You have just been rewarded"); 
 
    } 
 
} 
 

 
var orig_doSomething = window['doSomething']; 
 

 
window['doSomething'] = function() { 
 
    orig_doSomething.apply(null, arguments); 
 
    // your code, or a call to your function 
 
    alert("Wow, doSomething just finished executing with these arguments - " + JSON.stringify(arguments)); 
 
};
<button type="button" onclick="doSomething(200);">Callback gets called </button>

0

それはnew Function(newBody)で新しい関数を作成することは可能だが、それは非常に、非常に恐ろしいソリューションです。それが可能なら、それをしないでください。

0

あなたがそうのように、Functionコンストラクタを使用して、新しいボディを使用して機能を構築することができます:あなたはそれがevalの一部のようなものだということに気づくので、あなたは、サードによって提供されたデータを渡さないことを確認する必要がありしかし

function injectToCallback(callbackFunction, newBody) { 
    var entire = callbackFunction.toString(); 
    var args = entire.match(/^function.+\((.+)\)/); 
    var body = entire.substring(entire.indexOf("{") + 1, entire.lastIndexOf("}")) + newBody; 
    return new Function(args ? args[1] : "", body); 
} 

パーティのもの、つまりユーザー。

を使用することをおすすめします。

関連する問題