2017-12-07 2 views
1

Ich habe eine in-Browser-Partikel-Engine in Three.js ausgeführt. Ich möchte Animationsfunktionalität hinzufügen, also habe ich eine Texteingabe, die Code enthält, der von meiner "animieren" -Funktion aufgerufen werden sollte, die die Position und andere Informationen der Partikelemitter aktualisiert. https://i.imgur.com/vguWZAq.jpg So bewerten Sie eine JavaScript-Funktion von einer Texteingabe

function animate() { 

    time = Date.now(); 

    runCustomAnimateScript(); 

    for(var i = 0; i < emitters.length; i++){ 
     emitters[i].updateParticles(deltaTime); 
    } 

    render(); 

    requestAnimationFrame(animate); 
} 

function runCustomAnimateScript(){ 
    //Filled from text input after updateCustomAnimateScript is called 
    //Called from within animate (which is run every frame) 
} 

function updateCustomAnimateScript(){ 
    //Parse document.querySelectorAll("textarea[name='customAnimateScript']").value 
    //into a script, and enter it into runCustomAnimateScript 
} 

Zur Zeit habe ich keine Möglichkeit, diese Texteingabe in eine ausführbare JavaScript-Funktion einzuschalten. Ich bin überrascht, dass das vorher noch niemand versucht hat oder zumindest gepostet hat?

+0

* Ich bin überrascht, dass niemand versucht hat, dies vorher zu tun * Das ist praktisch alles, was [jsfiddle] (https://jsfiddle.net/) tut. Das Problem besteht darin, dass das Ausführen von Code wie diesem etwas gefährlich sein kann, insbesondere wenn Sie Code auswerten, der von anderen Benutzern kommen könnte, etwa wenn Sie Message Board-Signaturen als JavaScript auswerten. Stellen Sie sicher, dass Sie nur den vom Benutzer bereitgestellten Code ausführen. – zero298

Antwort

-1

Ich habe gerade die Lösung gefunden - mit der JavaScript-Funktion eval.

runCustomAnimateScript = function(){ 
    eval(document.querySelectorAll("textarea[name='customAnimateScript']")[0].value); 
} 
+1

Eval _ist_ eine Option, kann aber riskant sein, siehe die andere Antwort. – msanford

1

Die alte Art und Weise Sie beliebigen Code auswerten ist durch die eval() Methode.

Ein besserer Weg ist die Verwendung Components.utils.evalInSandbox, aber die Unterstützung kann begrenzt sein.

function runCustomAnimateScript(){ 
    const sandbox = new Components.utils.Sandbox("http://www.your-url.com/"); 
    let result = Components.utils.evalInSandbox(document.querySelectorAll("textarea[name='customAnimateScript']").value , sandbox); 
} 
0

Für Vollständigkeit, eine andere Möglichkeit, dies zu tun, ist ein <script> Tag zu erstellen, stellen Sie den Körper des Skripts mit dem Code des Benutzers, und fügen Sie das Skript auf das DOM:

document.querySelector("button").addEventListener("click", e => { 
 
    e.preventDefault(); 
 
    const script = document.createElement("script"); 
 
    script.innerHTML = document.querySelector("textarea").value; 
 
    document.body.appendChild(script); 
 
    document.body.removeChild(script); 
 
});
textarea { 
 
    width: 500px; 
 
    height: 10em; 
 
}
<textarea></textarea><button type="button">Run</button>

Seien Sie einfach vorsichtig. Sowohl diese Methode als auch eval() können Sie für Code-Injection-Angriffe öffnen.

Verwandte Themen