Ich hatte neulich eine einzigartige Programmierherausforderung, die ich hier teilen wollte. Sie ist ziemlich spezifisch und wird wahrscheinlich keinen großen allgemeinen Nutzen haben, aber hey, sie könnte interessant sein.
Die Idee war, 160 Zeichen "auswählen" zu lassen, wenn man auf einen beliebigen Buchstaben in einem Textblock klickt

Ich dachte nicht, dass es möglich sei, den Text automatisch "wirklich" auszuwählen, da mir das eher wie eine Funktion auf Betriebssystemebene vorkam. Aber ich weiß es wirklich nicht, korrigiert mich, wenn ich falsch liege. Also habe ich stattdessen versucht, es zu "simulieren", indem ich eine Hintergrundfarbe hinter die entsprechenden Zeichen gelegt habe. Im Kontext dessen, was wir taten, funktionierte das sowieso gut. Dann wurden dieselben Zeichen in ein Textfeld verschoben, um sie eventuell zu bearbeiten und einzureichen.
Der schwierigste Teil war für mich, einen Weg zu finden, um genau herauszufinden, auf welches Zeichen in einem Textstring geklickt wurde. Also habe ich wieder geschummelt. Ich dachte, wenn ich jedes einzelne Zeichen in einen <span> einpacke, könnte ich auf Klick-Ereignisse auf jeden dieser Spans achten. Genauso gut. jQuery wie üblich
var theText = $("#theText");
var theString = theText.text();
var numCharacters = theString.length;
var newHTML = "";
for (i = 0; i <= numCharacters; i++) {
var newHTML = newHTML + "" + theString[i] + "";
}
theText.html(newHTML);
Jetzt habe ich (gebunden?) Klick-Ereignisse an jedes dieser neuen, in Spans verpackten Zeichen gebunden. Wenn sie angeklickt werden, wird die "ausgewählte" Klasse von allen entfernt und dem angeklickten hinzugefügt. Dann wird eine for-Schleife 160 Mal ausgeführt. Sie geht zum nächsten Zeichen und hebt es hervor (indem sie eine Klasse hinzufügt)
$("span").click(function(){
$("span").removeClass("selected");
$(this).addClass("selected");
var nextSpan = $(this);
for (i = 1; i <= 160; i++) {
nextSpan = nextSpan.next();
nextSpan.addClass("selected");
}
});
Da ich diesen neu ausgewählten Text auch in ein Textfeld verschieben wollte (zur möglichen weiteren Bearbeitung), führe ich eine zweite Schleife innerhalb der Klickfunktion aus. Diese zweite Schleife durchläuft jedes Zeichen, das gerade ausgewählt ist, und hängt es an eine Zeichenkette an, die in einem jQuery-Daten-Chunk gespeichert ist. Am Ende der Schleife wird dieser Daten-Chunk auf das Textarea angewendet
$("#result").data("result", "");
$(".selected").each(function() {
var oldResults = $("#result").data("result");
var newResults = oldResults + $(this).text();
$("#result").data("result", newResults);
});
$("#result").val($("#result").data("result"));
Da das Ziel darin bestand, die Zeichen letztendlich an eine andere URL zu übermitteln, habe ich einen Button erstellt, der dies tut. Wenn dieser Button geklickt wurde, nahm er den Wert des Textfeldes, fügte ihn an eine URL an und sandte ihn ab
$("#sendit").click(function() {
var toURL = "?=" + $("#result").val();
window.location = toURL;
return false;
});
Also wieder, ziemlich spezifisch und ich bin sicher, nicht weit verbreitet nützlich, aber ich hatte noch nie eine andere Funktionalität wie diese gesehen, also vielleicht ist sie für jemanden in einer ähnlichen Situation nützlich.
Demo ansehen Dateien herunterladen
UPDATE: Wie ich gehofft hatte, sprang jemand mit einem anderen (schlauen) Ansatz ein: Matt Wondra hat hier eine Demo verfügbar. Er nutzt ein Textarea und JavaScript "ranges". Die einzige Schwäche ist die inhärente Dummheit von Textareas, die nicht in der Höhe mit dem Inhalt wachsen können.
Sehr netter kleiner Trick. Ich mag ihn. Ich sage es dir, Mann. jquery-tricks.com. Die Zukunft. =)
wird für einige zukünftige Projekte hilfreich sein,.. danke
Mein erster Gedanke, als ich den Titel sah, war: "Warum 160 Zeichen? Twitter ist auf 140 begrenzt." Obwohl Ihr Beitrag nichts mit Twitter zu tun hat, hat er mir eine Idee gegeben.
Ich habe gerade ein Firefox-Add-on (ReplacURLr) erstellt, das den Text in der Adressleiste durch eine gekürzte URL ersetzt, um über TwitterBar zu twittern. Ich glaube, ich werde die Option hinzufügen, 140 Zeichen Text in die Leiste zu kopieren. Danke für die Inspiration!
Sie haben Recht mit Twitter und seinem 140-Zeichen-Limit, aber eine Textnachricht ist normalerweise 160 Zeichen und Twitter erlaubt nur 140, damit sie einen Namen hinzufügen können. Also wirklich, es sind wie 160.
Hallo Chris.
Ich bin mir nicht sicher, ob das für Sie wichtig ist oder nicht, aber eine Textnachricht ist nicht immer 160 Zeichen lang. Es sind 160 Standard-Zeichen, aber viele einfache ASCII-Zeichen werden im GSM-Zeichensatz als Doppelzeichen dargestellt – Dinge, die Sie leider recht häufig verwenden könnten, wie €, [, ], {,}, ^.
Eine vollständige Liste finden Sie hier: http://www.mxtelecom.com/us/tech/knowledge_base.jsp?faqid=5#question7.
Ich kann Ihnen wahrscheinlich helfen, wenn das für Sie wichtig ist, schreiben Sie mir einfach.
Tom
Das wäre noch besser gewesen, wenn Sie in der Nähe des "Genehmigen"-Buttons einen "Kopieren in die Zwischenablage"-Button platziert hätten.
Mein erster Instinkt war, dass man mit JavaScript die Länge des Textblocks ermitteln und ihm helfen könnte, ohne jeden Charakter in einen Span zu packen – aber jetzt, wo ich darüber nachdenke, glaube ich nicht, dass das möglich ist (wie könnte JavaScript die Cursorposition mit der Zeichennummer in Beziehung setzen? Jemand?).
Außerdem müsste man ziemlich ausgefallene Dinge machen, um nur TEILE des ausgewählten Blocks hervorzuheben. So sehr ich auch sagen möchte, dass es einen besseren Weg gibt, ich denke, Sie haben hier genau ins Schwarze getroffen.
Jetzt haben Sie mich neugierig gemacht, Chris. Ich weiß, dass es einen einfacheren Weg gibt, das zu tun, aber zumindest funktioniert Ihr Weg :)
Ich bin sicher, es muss einen besseren Weg geben. Zwei ziemlich langsame Schleifen werden hier ausgeführt. Aber ja, es funktioniert.
Das klingt nach einem wirklich lustigen und herausfordernden Problem. Ihre Lösung ist wirklich schön, aber wie Eric bin ich gespannt, ob es einen besseren Weg gibt…
Eines der größten Dinge, das mir Sorgen bereitet, ist, dass dies die "Kopier"-Funktionalität bricht – der Usability-Purist in mir sagt, dass, wenn der Text ausgewählt aussieht, Strg/Cmd+C funktionieren sollte.
Ich frage mich (nur aus dem Stegreif) – haben Sie in Erwägung gezogen, den Text in ein textarea-Element zu legen? Ich bin ziemlich sicher, dass es einige JavaScript-Funktionen für die aktuelle Cursorposition und Ähnliches gibt, und Sie könnten es immer so stylen, dass es nicht wie ein textarea aussieht. Natürlich, wenn Sie ein echter Purist sind, werden Sie mit der Unsemantik davon ringen, aber ich bin mir nicht sicher, ob Zeichen-Spans viel besser sind…
Jedenfalls nur neugierig. Wenn Sie das nicht versucht haben (oder es bereits als undurchführbar ausgeschlossen haben), werde ich es vielleicht später am Tag ausprobieren.
Wie immer tolle Arbeit!
Schönes Trucking (Fahrzeug) in der Tat.
Es funktioniert jedoch nicht, indem man Text auf die "normale" Weise auswählt: durch Klicken und Ziehen, was meiner Meinung nach die Art ist, wie die meisten nicht-technischen Benutzer Text auswählen würden.
Cooler Trick trotzdem.
Danke.
Ich frage mich, ob es einen Platz für die jQuery wrap-Funktion gibt, um die Zeichen automatisch zu umschließen, aber ich glaube, dass eine Lösung vielleicht in den JS-Boxen vieler Coding-Websites liegt, die "Alle auswählen"-Optionen haben, ala snipplr.com.
vielleicht sollten wir anfangen, Text in "textarea" anstelle von "p" einzufügen
nur ein Gedanke
Sie verwenden die Selection API von Javascript, um ausgewählte Bereiche abzurufen, den Bereich zu erweitern und so weiter. Hier ist sie für Mozilla
MDC Selection
Ich habe noch nie tatsächlich Bereiche verwendet, aber es sollte möglich sein, dies mit der "echten" Auswahl zu tun, indem man Bereiche nutzt und sie zur Auswahl hinzufügt.
https://developer.mozilla.org/en/DOM/Selection
https://developer.mozilla.org/en/DOM/range
http://christophdum.com/syntaxhighligher/grabber019.htm
(klicken Sie auf den Text und sehen Sie einen Cursor + Text auswählen -> sehen Sie, was passiert (es funktioniert irgendwie, obwohl es ziemlich fehlerhaft ist (zum Beispiel: nur Text innerhalb eines Absatzes auswählen, weil es das gesamte HTML innerhalb der Auswahl entfernt)))
Ich habe eine Weile mit JS-Textauswahl herumgespielt (ich versuche schließlich, einen Textbereich-Ersatz zu erstellen (und vielleicht irgendwann einen schönen kleinen JS WYSIWYG-Editor oder Syntax-Highlighter zu erstellen))
Jedenfalls war das Umschließen jedes einzelnen Zeichens auch meine erste Idee, aber das ist Mist
Die Verwendung von Bereichen fügt kein unnötiges HTML hinzu und setzt den Cursor GENAU dorthin, wo Sie ihn haben möchten (wenn Sie links vom Zeichen klicken, wird der Cursor links platziert / wenn Sie auf die rechte Seite klicken, wird der Cursor nach dem Zeichen eingefügt (genau wie in einem echten Texteditor))
PS: Für all Sie Usability-Leute: Wenn ein Text ausgewählt ist, könnten Sie diesen Text in eine nicht sichtbare Textbox kopieren und mit .focus() versehen, damit der Benutzer ihn kopieren kann.
PPS: Dies ist nur ein Hobbyprojekt von mir – der Code ist hässlich und fehlerhaft – er ist nur ein Proof of Concept (ich schreibe normalerweise guten Code und verwende jQuery ;) )
@Sean + @ddunlop – Das Problem liegt eher darin, das genaue Zeichen zu finden, auf das der Benutzer geklickt hat. Wenn man bereits weiß, welchen Bereich man möchte, sind Selection und Range einfach. Deshalb musste Chris jedes Zeichen in einen Span packen – damit das Javascript weiß, welcher Buchstabe angeklickt wurde.
Neues: Ich habe es mit textarea geschafft! :D
Sehen Sie die Demo unter http://mattwondradesign.com/tests/highlightchars/.
Das größte Missgeschick bei der Verwendung von Textareas ist, dass sie nicht vertikal flexibel sind, sodass Sie einen zusätzlichen JavaScript-Hook hinzufügen müssten, um das textarea an den Inhalt anzupassen. Aber es ermöglicht Strg/Cmd+C und erfordert keine Spans, um den Klick zu finden!
Ich bin mir nicht ganz sicher, ob man es als Verbesserung bezeichnen würde, aber vielleicht ist es einfach eine andere Möglichkeit, es zu tun.
Schön! DEFINITIV eine Verbesserung. Das ist ein Nachteil, dass Textareas nicht dynamisch vergrößerbar sind. Das ist ein kleines Problem bei HTML-Ipsum: http://html-ipsum.com/
Ich werde den Artikel aktualisieren, um auch auf Ihre bessere Lösung hinzuweisen.
Es ist möglich: http://james.padolsey.com/javascript/jquery-plugin-autoresize/
Ausgezeichnet. Implementiert.
http://html-ipsum.com
Wenn Sie auf ein Zeichen klicken, wird der Anker der Fensterauswahl auf das Zeichen gesetzt, auf das Sie geklickt haben. Diese einfache Funktion ( + mootools addEvent) wählt also die nächsten 140 Zeichen oder den Rest des Knotens aus.
window.addEvent('domready',function() {
$$('p').addEvent('click',function(e) {
var s = window.getSelection();
s.extend(s.anchorNode, s.anchorOffset + 140 < s.anchorNode.length ? s.anchorOffset + 140 : s.anchorNode.length);
});
});
Mit nur ein wenig mehr Arbeit könnten Sie die zusätzliche Länge speichern und dann so viele Zeichen aus dem nächsten Knoten zur Auswahl hinzufügen.
Die Selection API macht eine solche Aufgabe wirklich super einfach :)
Es wäre wunderbar, wenn das überall funktionieren würde... Soweit ich das beurteilen kann, ist in Opera, es sei denn, Sie wählen tatsächlich Text aus (z. B. wenn Sie nur klicken), der anchorNode nur der gesamte Elterknoten des Elements ist, auf das Sie geklickt haben, und anchorOffset ist immer 0
$('p').click(function(e) { // jQuery
s = window.getSelection();
alert(s.anchorOffset);
});
Das ist fair, wenn man darüber nachdenkt: Klicken macht keine Auswahl im wirklichen Sinne. Ich habe es in IE nicht getestet, aber ich habe keine großen Hoffnungen...
Was uns dazu bringt, wieder jeden Charakter in einen Span packen zu müssen...
Schöner Trick!
Semi-Off-Topic-Frage: Wie wird der ausgewählte Text auf Ihrer Website orange? jQuery? CSS3?
Danke trotzdem :)
Die Verwendung des Range-Tricks ist besser, wie ich denke, aber es gibt noch ein anderes Problem mit textarea,
wenn der Text kein einfacher Text ist, sondern HTML. Wie zum Beispiel der Inhalt einer Webseite, gibt es auch eine andere Lösung mit Range, denke ich.
Direkt bevor ich diesen Beitrag gelesen habe, habe ich diese Frage auf Stackoverflow für eine mehrfarbige Textbox gestellt: http://stackoverflow.com/questions/700433/ideas-for-multicolored-textbox.
Ihre Technik (und die daraus resultierenden Kommentare) hat mir einige Inspiration gegeben, womit ich arbeiten kann.
@cant
Ich war auch von dem Trick mit dem ausgewählten Text beeindruckt. Die Antwort liegt in einem früheren Beitrag
https://css-tricks.de/overriding-the-default-text-selection-color-with-css/
Danke Chris, gute Arbeit!