0

Javascript escape() in C# – ein C# äquivalent zur escape()-Funktion

csharp_vs_javascriptDas .Net-Framework bietet eine große Anzahl an Möglichkeiten, um HTML-Code und Urls zu encodieren. Da wären zum Beispiel Uri.EscapeDataString(), Uri.EscapeUriString(), System.Web.HttpUtility.UrlEncode(), System.Web.HttpUtility.UrlPathEncode(), System.Web.HttpUtility.HtmlEncode() oder System.Web.HttpUtility.HtmlAttributeEncode().

Wenn man jedoch eine gleichwertige Funktion zu Javascript‘s escape() sucht, so wird man von all diesen Funktionen enttäuscht. Keine dieser standardmäßig vom .Net-Framework mitgelieferten Funktionen ist äquivalent zur Javascript escape()-Funktion.
Zur Verdeutlichung habe ich mal folgendes Beispiel gemacht:

// Original Ausgangsstring
// Raffi's ärgerlicher C# Teststring/Testcode.

// JS Original (erzeugt durch escape() )
// Raffi%27s%20%E4rgerlicher%20C%23%20Teststring/Testcode.

// Uri.EscapeDataString():
// Raffi's%20%C3%A4rgerlicher%20C%23%20Teststring%2FTestcode.

// Uri.EscapeUriString():
// Raffi's%20%C3%A4rgerlicher%20C#%20Teststring/Testcode.

// System.Web.HttpUtility.UrlEncode():
// Raffi%27s+%c3%a4rgerlicher+C%23+Teststring%2fTestcode.

// System.Web.HttpUtility.UrlPathEncode():
// Raffi's%20%c3%a4rgerlicher%20C#%20Teststring/Testcode.

// System.Web.HttpUtility.HtmlEncode():
// Raffi's ärgerlicher C# Teststring/Testcode.

// System.Web.HttpUtility.HtmlAttributeEncode():
// Raffi's ärgerlicher C# Teststring/Testcode.

Doch ich würde nicht darüber bloggen, wenn ich nicht auch eine Lösung parat hätte. Und diese ist gar nicht mal so kompliziert.

Schritt 1:

Fügt eurem Projekt einen Verweis auf Microsoft.JScript hinzu.

microsoft jscript verweis hinzufügen

Schritt 2:

Nun steht euch die Funktion Microsoft.JScript.GlobalObject.escape() zur Verfügung. Diese wandelt einen übergebenen String exakt so um, wie es die Javascript escape()-Funktion auch tut. (Das liegt daran, dass ihr mittels dieser Methode auf die Microsoft eigene JScript-Engine zugreift.) Und mittels dieser Funktion klappt nun auch das oben genannte Beispiel.

// Original Ausgangsstring
// Raffi's ärgerlicher C# Teststring/Testcode.

// JS Original (erzeugt durch escape() )
// Raffi%27s%20%E4rgerlicher%20C%23%20Teststring/Testcode.

// Microsoft.JScript.GlobalObject.escape():
// Raffi%27s%20%E4rgerlicher%20C%23%20Teststring/Testcode.

Ich hoffe ich konnte dem ein oder anderen unter euch weiterhelfen. Kennt ihr vielleicht noch eine andere oder vielleicht bessere Möglichkeit um in C# die Javascipt escape()-Funktion nachzubilden?

0

globalCompositeOperation Copy Fix – transparente Flächen in Javasript Canvas zeichnen

Heute gibt es mal einen sehr speziellen Beitrag. Ich denke, die Leute die betroffen sind, werden verstehen worum es geht. Allen anderen sei gesagt, dass der nächste Artikel wieder ein für ein breiteres Publikum sein wird.

Ich hatte hier im Blog vor einiger Zeit ja eine kleine Progressbar vorgestellt, die ausschließlich in JavaScript umgesetzt ist. Besonderes Augenmerk hatte ich unter anderem auf die schönen runden Ecken gelegt. (Siehe: nachfolgender Screenshot)

Javascript only Progressbar

Ursprünglich hatte ich die transparenten Ecken mittels eigener Pfade realisiert, die ich mit

ctx.globalCompositeOperation = "copy";
ctx.fillStyle = "rgba(0,0,0,0.0)";
ctx.fill();

gefüllt habe.

Leider musste ich beim erneuten betrachten der Progressbar gestern sehen, dass das Script so nicht mehr funktioniert. Die Javascriptkonsolen in diversen Browsern (IE, FF, Chrome) gaben mir merkwürdiger Weise aber keinen Fehler aus.

Nach einigem googlen fand ich heraus, dass die globalCompositeOperation “copy” nicht mehr korrekt implementiert ist/unterstützt wird. Eine Lösung zu finden, war gar nicht so einfach, doch ich habe sie gefunden.

Transparente Flächen lassen sich immer noch wunderbar zeichnen. Dafür sind lediglich zwei Änderungen nötig. Zum einen muss der Wert für globalCompositeOperation auf “destination-out” umgestellt werden und die Füllfarbe muss komplett sichtbar sein. Bezogen auf meine Progressbar sieht das dann wie folgt aus:

ctx.globalCompositeOperation = "destination-out";
ctx.fillStyle = "rgba(0,0,0,1.0)";
ctx.fill();

So einfach kann’s sein. Ich hoffe ich kann hiermit dem ein oder anderen Verzweifelten helfen.

Viele Grüße,
Raffi

3

JavaScript Progressbar mit HTML5 Canvas

JavaScript Progressbar

Da ich für ein zukünftiges Webprojekt eine Progressbar brauchte, wenn möglich auf JavaScript basierend, und ich keine Komponente finden konnte, die meinen Vorstellungen entspricht, habe ich mich entschieden, meine eigene Progressbar zu schreiben.

Umgesetzt wurde das Projekt in Javascript unter Zuhilfenahme des HTML5 Canvas Elements. Dadurch kommt die Progressbar vollständig ohne irgendwelche Bilddateien aus, wie es zumeist bei anderen JS/CSS Lösungen der Fall ist. Die Progressbar kann momentan einen Status von 1 bis 100 Prozent anzeigen. Fehleingaben werden abgefangen und es wird, auch optisch, eine Errormeldung angezeigt.

Da ich meine Entwicklungen gerne teile und sicherlich nicht der Oberprofi in JavaScript bin, stelle ich euch die Progressbar natürlich zur Verfügung. Für Kritik, Lob und Verbesserungsvorschläge bin ich wie immer jederzeit offen.

Eine Demo der Progressbar könnt ihr euch hier anschauen. Denn Quellcode findet ihr hier: pbar.js
Nachfolgend zeige ich euch noch schnell, wie man die Progressbar verwenden kann.

In eurer HTML-Seite müsst ihr zuerst das Progressbar-Script, sowie die jQuery Library einbinden. Danach benötigt ihr ein Canvas-Element, dessen Größenangaben gleichzeitig auch bestimmen, wie groß eure Progressbar gerendert wird. Zu guter Letzt müsst ihr die Progressbar noch zeichnen lassen.

<html>
	<head>
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
		<script type="text/javascript" src="pbar.js"></script>
	</head>
	<body>
		<canvas id="cvs" width="800" height="50">
			Dein Browser kann diese Grafik nicht darstellen.
		</canvas>
		<script>
		drawCanvas(55,'cvs'); //Progressbar mit 55% in Canvas mit ID=cvs rendern
		</script>
	</body>
</html>

Das war’s auch schon. Ich hoffe der ein oder andere von euch findet seine Freude daran!

Viele Grüße,
Raffi