Jquery function einfrieren oder mit Pfeiltasten verändern

Hallo Experten,

ich möchte die beschriebene Funktion die durch den Knopf Show ausgelöst wird in diesem Link http://www.bestaltmed.at/SpeedreadingII/indexx.php bearbeiten:

1 Sie soll mit der Space taste angehalten und fortgesetzten werden.

2 Die Funktion soll immer 2 Wörter erfassen. Im Moment erfasst sie am Anfang immer zwei und dann einen ganzen string.

3 Diese 2 Wörter sollen während die Funktion läuft mit der Pfeiltaste rauf auf 3,4,5,6,… Wörter erhöht oder mit der Pfeiltaste runter wieder gesenkt werden.

4 Gibt es eine Möglichkeit diese Funktion auch ohne diese (http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/j…) JS Datei von Google auszuführen?

Hat dazu jemand Ideen?
Danke schon im Voraus für alle nützlichen Antworten.

Liebe Grüße,
Chris

Hallo, nein, da kann ich Dir leider nicht weiterhelfen. Ohne eine Verwendung des jQuery-Cores muss die Tastenabfrage auch ‚von Hand‘ programmiert werden.

Hallo Chris,
wurde ich hier als Java-Script experte vorgeschlagen? (Ich hatte das eigentlich in meinem Profil auf „aus“ stehen).

4.:
Ja Du kannst natürlich so eine Funktion auch komplett ohne Jquery realisieren. Ich sehe, dass die index.js bereits in Teilen auf JQuery verzichtet. Mann kann jquery ansonsten auch von jquery.org herunterladen und eine version auf dem Server ablegen.

1.,3.: Reaktion auf Tastendrücke wird in Jquery z.B. über keypress gesteuert:
http://api.jquery.com/keypress/

Der Replace mit b[2] schlägt dann fehl, da er nur auf das Wort schaut und das gibt es irgendwann doppelt womit das spanende vor dem Anfang landet.

Um den Fehler besser zu finden empfehle ich einen Debugger, wie z.B. Firebox (beim Firefox).

Viele Grüße von IchSchwarzAlles

Nachtrag für ein paar Tippfehler:
Mit „spanende“ meine ich span-ende. Und der gemeinte Debugger heißt Firebug (nicht Firebox).

  1. Mach ein Minimalbeispiel, das nur diese eine Problem mit so wenig Code rundrum wie möglich enthält. Sorry, es ist eher unwahrscheinlich, dass sich jemand in dein Projekt einarbeitet.

      1. Gerade für Tastatursteuerung und die Manipulation gibt es sehr viele Beispiele. Kann ich dir auch zeigen, wenn es ein konkretes Problem gibt.
  2. jQuery würde ich unbedingt empfehlen, das erspart dir eine Menge Arbeit.

Hallo IchSchwarzAlles,

danke für die AW.
Was kann ich in diesem Punkt machen:
2.
Der Replace mit b[2] schlägt dann fehl, da er nur auf das Wort schaut und das gibt es irgendwann doppelt womit das spanende vor dem Anfang landet.

Kann ich den Code verwenden oder muss ich diesen umschreiben?

Lg,
Chris

Hallo NetAction,

vielen danke für deine AW.

  1. Der Link ist dass Minimalbeispiel: http://www.bestaltmed.at/SpeedreadingII/index.js

3.Wie würde eine Grundstruktur für eine Keypress Funktion mit Pfeil nach oben aussehen?

  1. Das Problem liegt daran, dass sich dass Wort wiederholt. Ich weiß aber nicht wie ich diese Funktion ändern kann, dass die jquery Funktion nicht auf selbe Wörter achtet.

Lg,
Chris

Hallo Chris,
da der Code dort einen Fehler enthält (sofern im Text nicht jedes Wort nur genau einmal vorkommt) muß der umgeschrieben werden.

Dazu sollte grob gesagt der replace nur auf den Teil nach dem angesetzt werden. Außerdem sollte man in den Match beide Worte einbringen und nicht nur das erste.

Generell kann man mit Einsatz regulärer Ausdrücke im replace hier ggf. besser arbeiten.
Siehe hierzu:
http://de.selfhtml.org/javascript/objekte/string.htm…
und:
http://de.selfhtml.org/javascript/objekte/regexp.htm

Ein um zwei Worte nach rechts zu verschieben wäre dann ca. so (ungetestet)
neu = alt.replace(/([^]+ [^]+)/i,"$1");

[^] steht für „nicht leerzeichen“
und das / vor dem span ist ein escape-zeichen(backslash) + slash.

1 Like

Hallo Chris, hierzu kann ich im Moment auch nichts Konkretes sagen, weil ich mich noch nicht damit befasst habe.
Mit Einfrieren ist sicher Verlassen der Funktion und Wiederaufruf gemeint?
. Leider kann ich nicht sagen, ob eine Variablenübergabe nötig ist.
Die Frage nach der Möglichkeit, ohne die JS- Datei das Ganze auszuführen ist sicherlich gegeben, aber sehr aufwendig.Grundidee: Über den Tastencode der Space-Taste die eigene Funktion aufrufen beziehungsweise verlassen Man muss den ganzen Text als String betrachten und zeichenweise analysieren. Jedes Wort endet mit einem Lehrzeichen und kann dadurch als Teilstring in einer kleinen ZUsatzdatenbank abgespeichert werden. In einer Schleife mit gezählter Wiederholung können dann die gewünschten Wörter selektiert werden. Die Anzahl wird mit einer Tastencode- basierten IF- Anweisungsfolge geändert. In der Hoffnung, wenigstens eine neue Idee gegeben zu haben
Viele grüße Hajo

Hi Chris,

sorry, keine Ahnung.

LG, Roland

Hallo IchSchwarzAlles,

danke nochmals für deine AW.
Ja ein Replace wie dieser macht Sinn.
Ich hab jetzt mehrere Möglichkeiten versucht.
Jetzt frag ich mich ob das überhaupt Möglich ist, da man ja wieder beim integrieren 2 Wörter überspringen muss.
Ich hab hier im Source code alle css und js Datein zusammengefasst. ( http://www.bestaltmed.at/SpeedreadingII/try/indexx.php )
Vll kannst du es auch nochmal versuchen?
Aber kann man bei replace Wörter überspringen und anschließend noch etwas einfügen?

Lg,
Chris

habe mal etwas zusammenprogrammiert.
Habe die Sachen, die fertig gelesen sind in ein extra Feld gepackt, was aktiv ist und was noch zu lesen ist…
Steuerung und Anzeige ist auch mit drin.

hier erstmal indexx.css:

_______________
.green {
color:green;
background-color:rgb(200,200,200);
border:1px solid rgb(0,0,0);
}
#read {
background-color:rgb(100,100,100);
}
#toread {
}
_______________

danach reading.html :
_______________

Text Reading
var controller_counttospeak=3;
var controller_showactive=true;
var minwords=1;
var maxwords=5;
var textplay=„Play“;
var textstop=„Stop“;

Spielt ab?:

Wörter pro Einheit:

Das ist der Mustertext mit vielen wrtern … tausende folgen
Das ist der Mustertext mit vielen wrtern … tausende folgen
Das ist der Mustertext mit vielen wrtern … tausende folgen
Das ist der Mustertext mit vielen wrtern … tausende folgen

Show

_______________

und danach noch die kleine index.js -Datei:
_____________________
//http://www.ryancooper.com/resources/keycode.asp
document.onkeydown = checkKeycode
function checkKeycode(e) {
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (e) keycode = e.which;
//alert("keycode: " + keycode);

var savecontroller_counttospeak=controller_counttospeak;
if (keycode==32) //Leertastenevent
{
if (controller_showactive==true)
{controller_showactive=false;}
else
{controller_showactive=true;}
}
if (keycode==38) //Pfeil nach oben
{
controller_counttospeak++;
//Fallback, wenn außer Grenze
var isok=worternowfallback(controller_counttospeak);
if (isok==false)
{
controller_counttospeak–;
}
updateshowfields();
}
if (keycode==40) //Pfeil nach unten
{
controller_counttospeak–;
//Fallback, wenn außer Grenze
var isok=worternowfallback(controller_counttospeak);
if (isok==false)
{
controller_counttospeak++;
}
updateshowfields();
}
updateshowfields();
}

function worternowfallback(value, fallbackvalue)
{
var isok=true;
if (value>maxwords || value1)
{
//alert(newtoread);
setTimeout(color_text, 1000);
}
else
{
controller_showactive=false;
updateshowfields();
}
}
}

setTimeout(color_text, 1000);
});
});

_____________________

leider wird das hier alles etwas schlecht formatiert. Sollte aber die Lösung deiner Probleme sein.

klar kann man das auch ohne jquery machen. Dann musst du nur die Sachen wie

var g = $(’#greendiv’).html();

durch
var g=document.getElementById(‚greendiv‘).innerHTML;

ersetzen.

bzw. würde dann aus
$(’#toread’).html(newtoread);

->

document.getElementById(‚toread‘).innerHTML=newtoread;

werden

Hallo Chris,
hier mal ein kurzes Beispielscript für das verschieben des tags:



txt=’<span class=„green“>Das ist</span> der Mustertext mit’;

alert(„2“);
do {
txt=txt.replace(/<span[^>]>(.)</span>( [^]+ +[^]+| [^]+ $|$)(.)/,
‚$1<span class=„green“>$2</span>$3‘);
alert(txt);
}
while (RegExp.$3!="")


txt=txt.replace(/([^]+ +[^]+)(.
)<span[^>]
>(.*)</span>/,
‚<span class=„green“>$1</span>$2$3‘);
alert(txt);

(Evtl. stimmen die Zeilenumbrüche nicht)

Dieses Beispiel verändert einen Text mithilfe des Replace Befehls und eines passenden regulären Ausdruckes.
Der Ausdruck entnimmt einzeln den Text zwischen den Spans, die zwei Worte nach dem Span (bzw. eins oder keins, am Textende) und den restlichen Text. Das landet in $1,$2,$3 und wird im zweiten Parameter von Replace wieder zusammengesetzt.
In der Schleife wird auf die Variable RegExp.$3 geprüft (entspricht $3). Wenn nichts mehr hinter dem Spann steht, dann wird mit einem neuen Replace der Span wieder an den Anfang gesetzt.

Weitere Hintergründe für Reguläre Ausdrücke gibt es bei den Links, die ich oben angegeben hatte und natürlich an vielen anderen Stellen im Netz.

Viele Grüße,
IchSchwarzAlles

1 Like

Hallo,

bei mir tut die Funktion nichts sichtbares. Was soll denn genau bezweckt werden?

Hallo Franky,

wow. Ich bin echt begeistert.
Vielen Dank.
Dass sieht echt super aus.
Ich hab die ganzen Skriptdaten einmal unter dieser Seite festgehalten: http://www.bestaltmed.at/speedreading.php
Das Anhalten funktioniert auch einwandfrei. Nur das weiterlesen mit Space anschließend funktioniert nicht.
Was kann ich da machen?

Danke,
Chris

1 Like
  1. Das kannst du mit keyPress abfragen:
    http://api.jquery.com/keypress/

  2. Dafür würde ich erstmal eine Funktion bauen, die dafür sorgt, dass man den String in seine Teile teilt. Zum Beispiel (ungetestet):

var pos = 0;
var count = 8;
var words = [];

function mySplit() {
words = [];
var a = $(’#text’).text().trim();
var parts = a.split(/\s/);
var len = parts.length;
for(var i=0;;i+=count) {
if(parts[i+1] == null) break;
var actlen = words.length;
words[actlen] = „“;
for(var j=0;j

  1. Gleiches mit dem keyPress abfangen und zum aufteilen hab ich in dem Beispiel gerade die Variable „count“ benutzt. Die einfach erhöhen und du bekommst größere Teile raus.

  2. Generell kannst du auch komplett ohne jQuery arbeiten, wenn gewünscht. jQuery ist ja auch nur viel JavaScript Code auf einem Haufen, um Dinge zu vereinfachen.

  1. Das ist alles andere als ein Minimalbeispiel. Brich es bitte so weit runter, dass du nur eine einzige Frage hast, und für diese Frage nur der nötige Code enthalten ist.

  2. Zu Tastatureingaben siehe z.B. http://stackoverflow.com/questions/1402698/binding-a…

  3. Sag, was du hast. Ein Element mit Text vielleicht. Und was genau mit diesem Text gemacht werden soll. Die Tastatur oder setInterval gehören nicht in diese Frage.

Danke für die AW.

Lg,
Chris