1

JavaScript の関数を完全に置き換えるにはどうすればよいですか?

このコードを取得しましたが、機能しません。ただし、DOM は更新されます。どうしたの?

<html>
<head>
    <script id="myScript" type="text/javascript">
        function someFunction() {
            alert("Same old.");
        }
    </script>
</head>
<body>

<input type="button" onclick="someFunction();" value="A button." />
<script>
    function replace() {
        var oldFunctionString = someFunction.toString();
        var oldContents = oldFunctionString.substring(oldFunctionString.indexOf("{") + 1, oldFunctionString.lastIndexOf("}") );
        var newCode = "alert(New code!);";        
        var newFunctionString = "function someFunction(){"+newCode+"}";
        var scriptTag = document.getElementById('myScript');

        scriptTag.innerHTML = scriptTag.innerHTML.replace(oldFunctionString,newFunctionString);
    }

    replace();
</script>

</body>
</html>

ここでJSfiddle

4

2 に答える 2

6

設定.innerHTMLはスクリプトを再実行しません。本当にそうしたい場合は、新しいscript要素を作成して DOM に追加する必要があります。これにより、以前のスクリプトが行ったことを上書きします (もちろん、すべての場合に可能というわけではありません)。

その機能を置き換えたい場合は、単に使用してください

somefunction = function() {
    alert(New code!); // syntax error, btw
};

もちろん、コードの一部だけを置き換えるには (すべてを知らなくても)、regex と co を試すことができます。新しい関数を変数に再割り当てするだけです。

somefunction = eval("("
  + somefunction.toString().replace(/(alert\().*?(\);)/, "$1New code!$2")
  + ")");
于 2012-11-03T16:38:08.040 に答える
2

関数自体ではなく、文字列を操作しようとしているようです。代わりにこれを行うだけです:

someFunction = function () { /* your function code here */ }
于 2012-11-03T16:38:12.033 に答える