Den mest pålitelige måten å kjøre Javascript i C#?


Først prøvde jeg å kjøre fra en WebBrowser-kontroll

WebBrowser webBrowser1 = new WebBrowser();
webBrowser1.Visible = false;
webBrowser1.Navigate("about:blank");
webBrowser1.Document.Write("<html><head></head><body></body></html>");

HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
dynamic scriptEl = webBrowser1.Document.CreateElement("script");

scriptEl.DomElement.text = "function test(fn) { try{ window[fn](); } catch(ex) { return 'abc     '.trim(); } }"
    + "function sayHello() { alert('ha'); throw 'error with spaces     '; }";
head.AppendChild(scriptEl);

var result = webBrowser1.Document.InvokeScript("test", new object[] { "sayHello" });

Det fungerer nesten perfekt. Den vet hva et window, alert er... Det eneste problemet er at den tydeligvis kjører på ECMA3, så da jeg testet "abc ".trim() kunne den ikke kjøre det.

Mitt andre forsøk var Javascript .NET.

using (JavascriptContext context = new JavascriptContext())
{

    // Setting external parameters for the context
    //context.SetParameter("console", new SystemConsole());
    context.SetParameter("message", "Hello World !           ");

    // Script
    string script = @"
        alert(message.trim());
    ";

    // Running the script
    context.Run(script);
}

Dessverre vet det ikke hva alert, window, document, console... er. Med mindre jeg forteller det ved å sette kontekstparametere.

Hva mer finnes det? Kanskje jeg burde prøve noen hodeløse nettlesere og kalle dem ved å bruke Process?

Svar #1

Hvis du vil kjøre JavaScript på serversiden, vil jeg anbefale å bruke PhantomJS. Det lar deg kjøre en full WebKit-nettleser fra kommandolinjen ved hjelp av JavaScript og kommandolinjeargumenter.

Svar #2

JavaScript er definitivt ikke bare for klient-side skripting lenger. Som Cameron sa, er PhantomJS utmerket hvis du trenger DOM-en. Hvis du ikke gjør det, er NodeJS det klare valget med et vell av biblioteker.

Relaterte artikler