Diskussionen, Lob, Kritik und Verbesserungsvorschläge betreffs der Quotenmeter-Hauptseite und des Forums.
Benutzeravatar
von Nerdus
#1263463
Aufbauend auf diesem alten Thread hier die neue Version des Greasemonkeyscripts für qtalk.de, das dem Forum einige Funktionen hinzufügt:
  • Ticker am Seitenanfang lässt sich ausblenden
  • Teaser am Seitenende lässt sich ausblenden
  • Themen mit eigenen Beiträgen können in der Themenliste besonders hervorgehoben werden (durch einen kursiv gesetzten Thementitel)
  • Themen und Foren ohne neue Beiträge werden nicht mehr fettgedruckt dargestellt
  • Foren und Themen lassen sich durch Doppelklick auf das Forums-/Themensymbol als gelesen markieren
  • Foren können automatisch als ›gelesen‹ markiert werden
  • Im Fav-Icon wird durch ein Ausrufezeichen angezeigt, ob ungelesene Beiträge/Benachrichtigungen/Private Nachrichten vorliegen
Da ist das gute Stück: http://pastebin.com/EegMb0Cy

Eine installierte Greasmonkey-Erweiterung für den Browser ist natürlich Voraussetzung :wink:
Zuletzt geändert von Nerdus am Mo 16. Nov 2015, 06:00, insgesamt 1-mal geändert.
#1263477
Danke für das Skript und ich habe die Doppelklickfunktion gleich für mich wieder übernommen!

Aber bin ich jetzt bescheuert oder hat nun jemand die Quickreply-Funktion gerade komplett entfernt? :shock:
Zuletzt geändert von little_big_man am Mo 8. Jul 2013, 19:59, insgesamt 1-mal geändert.
#1263484
Kaffeesachse hat geschrieben:
Nerdus hat geschrieben:Sieht so aus, ja – bei mir ist sie auch weg (auch ohne Script^^)
Das scheint aber nur hier in diesem "Brett" so zu sein.
Ja, stimmt. Ich dachte zwar, dass ich vorher auch in einem anderen Thread geschaut habe, aber überall sonst ist die Quickreply-Funktion noch da nur hier nicht...vielleicht weil die pro Subforum zuerst aktiviert werden muss und dieses Sub hier neu ist?

Wer übrigens meinen Einzeiler zur Einblendung der Quickreply-Funktion schon verwendet hat, sollte diesen nochmals updaten, denn ich habe gemerkt, dass der Schuld war, dass viele Funktionen, die weiter unten im Skript waren, nicht funktioniert haben, denn auf allen Seiten ohne Quickreply-Funktion (also auf der Start- und den Übersichtsseiten) hat das zu einer Null-Pointer-Exception geführt...welche Greasemonkey wohl einfach stillschweigend schluckt aber das Skript an dieser Stelle dann ohne Meldung abbricht...

Das Statement muss so aussehen (oder einfach die Version von Nerdus verwenden):
Code: Alles auswählen
// Schnellantwort immer eingeblendet haben
if (document.getElementById('quickreply') !== null) {document.getElementById('quickreply').style.display = ""};
von Plem
#1263493
Danke euch beiden für die Mühe, die ihr euch macht. Nerdus' Script funktioniert bei mir allerdings überhaupt nicht :( Aber eigentlich reichen mir auch die Funktionen, die lbm eingebaut hat, vollkommen.
Benutzeravatar
von Nerdus
#1263495
little_big_man hat geschrieben: hat das zu einer Null-Pointer-Exception geführt...welche Greasemonkey wohl einfach stillschweigend schluckt aber das Skript an dieser Stelle dann ohne Meldung abbricht...
Ja, das ist der große Nachteil beim Entwickeln für Greasemonkey, das aus der GM-eigenen Sandbox fast nichts an Fehlermeldungen rauszuholen ist … da kann schon was total banales wie ein Buchstabendreher zum rätselhaften Totalausfall mutieren :lol:
Plem hat geschrieben:Nerdus' Script funktioniert bei mir allerdings überhaupt nicht :(
Hast du’s aus dem Forum kopiert (da gab’s ja letztes Mal schon Probleme) oder von pastebin? Leider funktionieren die Dateianhänge im Moment nicht, sonst hätt ich’s wieder als fertiges Script hochgeladen :?
#1263496
Nerdus hat geschrieben:
Plem hat geschrieben:Nerdus' Script funktioniert bei mir allerdings überhaupt nicht :(
Hast du’s aus dem Forum kopiert (da gab’s ja letztes Mal schon Probleme) oder von pastebin? Leider funktionieren die Dateianhänge im Moment nicht, sonst hätt ich’s wieder als fertiges Script hochgeladen :?
Ich habe den Doppelklick-Teil aus dem Forum kopiert und da hatte es dann einige unnötige Zeilenumbrüche drin...die normalerweise nicht stören würden, aber an einem Ort war es bei einem Kommentar, was natürlich dazu geführt hätte, dass der Teil des Kommentars nach dem Zeilenumbruch als Code angeschaut wird von Greasemonkey....ich habe das vor der Ausführung bei mir gefixed, aber ich nehme an, dass das sicherlich zu einem Totalausfall geführt hätte...
Benutzeravatar
von Nerdus
#1263498
little_big_man hat geschrieben:
Nerdus hat geschrieben:
Plem hat geschrieben:Nerdus' Script funktioniert bei mir allerdings überhaupt nicht :(
Hast du’s aus dem Forum kopiert (da gab’s ja letztes Mal schon Probleme) oder von pastebin? Leider funktionieren die Dateianhänge im Moment nicht, sonst hätt ich’s wieder als fertiges Script hochgeladen :?
Ich habe den Doppelklick-Teil aus dem Forum kopiert und da hatte es dann einige unnötige Zeilenumbrüche drin...die normalerweise nicht stören würden, aber an einem Ort war es bei einem Kommentar, was natürlich dazu geführt hätte, dass der Teil des Kommentars nach dem Zeilenumbruch als Code angeschaut wird von Greasemonkey....ich habe das vor der Ausführung bei mir gefixed, aber ich nehme an, dass das sicherlich zu einem Totalausfall geführt hätte...
Ja, das Problem gab es letztes Mal schon mal :|
Direkt vom Forum ins GM-Fenster zu kopieren hat da auch zu Fehlern geführt, mit dem Umweg über einen Texteditor ging es dann.
Benutzeravatar
von Nerdus
#1263502
Na, wenn du die Werte zu 1 änderst, werden Ticker und Teaser natürlich wieder angezeigt :wink: Da waren die Nullen vorher schon richtig.

Der Rest sollte aber trotzdem funktionieren – geht denn das als gelesen markieren der Foren und Themen?
von Plem
#1263505
Nerdus hat geschrieben:Na, wenn du die Werte zu 1 änderst, werden Ticker und Teaser natürlich wieder angezeigt :wink: Da waren die Nullen vorher schon richtig.
Nein, hab's ja erst dann geändert, nachdem ich feststellte, dass es mit den 0en nicht funktioniert :(
Nerdus hat geschrieben:Der Rest sollte aber trotzdem funktionieren – geht denn das als gelesen markieren der Foren und Themen?
Nein :(

Aber wie gesagt, ist nicht so schlimm, da mir lbms Skript eigentlich völlig ausreicht.
von logan99
#1263509
Nerdus, kannst du den gleichen Background mit dem etwas helleren und dunkelern Grauton in das Script als Option einfügen? Ich fand das teilweise wieder zu grell zum lesen. Deine Version war da deutlich angenehmer fürs Auge.
Benutzeravatar
von Nerdus
#1263511
Plem hat geschrieben:Nein :(
Hmm, seltsam … wenn’s nicht am Kopieren liegt, dann weiß ich auch nicht. Naja, Hauptsache du hast eine Lösung :)
logan99 hat geschrieben:Nerdus, kannst du den gleichen Background mit dem etwas helleren und dunkelern Grauton in das Script als Option einfügen?
Mit den Hintergrundfarben hab ich mich noch nicht beschäftigt, das wollte ich für mich aber auch noch mal angehen, also … kommt dann vielleicht im Laufe der Woche :wink:
von logan99
#1263512
Nerdus hat geschrieben:Mit den Hintergrundfarben hab ich mich noch nicht beschäftigt, das wollte ich für mich aber auch noch mal angehen, also … kommt dann vielleicht im Laufe der Woche :wink:
Ok, danke dir...
Benutzeravatar
von Nerdus
#1264178
logan99 hat geschrieben:
Nerdus hat geschrieben:Mit den Hintergrundfarben hab ich mich noch nicht beschäftigt, das wollte ich für mich aber auch noch mal angehen, also … kommt dann vielleicht im Laufe der Woche :wink:
Ok, danke dir...
Hmm … bis jetzt hab ich noch keine Lösung gefunden, mit der ich so richtig glücklich bin. Mit den Rahmen mit den Farbverläufen lässt sich leider wenig farblich so richtig vereinbaren, ohne dass es ziemlich hingestümpert aussieht :?
von logan99
#1264296
Kein Ding. Mit deinem alten Script habe ich zumindest noch jeden 2. Beitrag etwas grau hinterlegt, was es schonmal angenehmer zum lesen macht, als wenn jeder Beitrag auf weißem Hintergrund geschrieben wäre.
#1289291
In den letzten ca. 2 Monaten habe ich nebenbei immer mal wieder an noch einigen Zusatzfunktionen gebastelt, die mir noch so in den Sinn gekommen sind. Da ich aber kaum Erfahrung mit Webentwicklung habe und auch nie mehrere Stunden am Stück daran gearbeitet habe, hat das alles etwas lange gedauert. Primär habe ich das natürlich für mich selbst gemacht, einerseits einfach aus Interesse am Programmieren und andererseits, weil es das Surfen hier im Forum für mich bequemer macht. Aber da ev. auch andere daran Interesse haben, präsentiere ich hier mal mein Ergebnis.

Zuerst habe ich den Doppelklick-Code von Nerdus analysiert und auf ähnliche Art zwei weitere Buttons mit solcher Ajax-Funktionalität ausgestattet.

"Foren als gelesen markieren" macht das nun ohne die Seite zu verlassen mit diesem Code:
versteckter Inhalt:
Code: Alles auswählen
var nav = document.getElementsByClassName('nav');
var boardLink = nav[0];
if (boardLink != undefined && boardLink.tagName == 'A') {
  boardLink.onclick = function() {
    var sAJAX = new XMLHttpRequest();
    sAJAX.open('GET', boardLink.href, true);
    sAJAX.send();

    var boards = document.getElementsByClassName('forumlink');
    var icon;
    for (i in boards) {
      if (i >= 0) {
        icon = boards[i].getElementsByTagName('img')[0];
        if (icon != undefined && icon.parentNode != undefined) {
          icon.parentNode.style.opacity = '0.33';
          icon.parentNode.onclick = '';
          icon.title = '';
          icon.parentNode.parentNode.parentNode.getElementsByTagName('td')[1].getElementsByTagName('h4')[0].getElementsByTagName('a')[0].style.setProperty ('font-weight', 'normal', 'important');
        }
      }
    }

    return false;
  }
}
"Themen als gelesen markieren" macht das mit diesem Code ohne die Seite zu verlassen:
versteckter Inhalt:
Code: Alles auswählen
var topicLink;
for (i in nav) {
  if (nav[i].tagName == 'TR') {
    topicLink = nav[i].getElementsByTagName('td')[1].getElementsByTagName('a')[0];
    break;
  }
}
if (topicLink != undefined) {
  topicLink.onclick = function() {
    var sAJAX = new XMLHttpRequest();
    sAJAX.open('GET', topicLink.href, true);
    sAJAX.send();

    var topics = document.getElementsByClassName('topictitle');
    for (i in topics) {
      if (i >= 0) {
        if (topics[i] != undefined && topics[i].parentNode != undefined && topics[i].parentNode.parentNode != undefined) {
          icon = topics[i].parentNode.parentNode.getElementsByTagName('td')[0].getElementsByTagName('img')[0];
          if (icon.src.indexOf('_unread') != -1) {
            icon.title = 'Keine ungelesenen Beiträge';
            icon.src = icon.src.replace(/_unread/, '_read');
            icon.onclick = '';
            topics[i].parentNode.getElementsByTagName('a')[1].style.display = 'none';
            topics[i].style.setProperty ('font-weight', 'normal', 'important');
            topics[i].parentNode.parentNode.getElementsByTagName('td')[0].style.border = 'none';
            topics[i].parentNode.parentNode.getElementsByTagName('td')[5].style.border = 'none';
          }
        }
      }
    }

    return false;
  }
}
Der Thread mit den Forumsregeln, der in jedem Subforum eingeblendet wird, empfinde ich auch als Platzverschwendung auf dem Screen und blende ihn deshalb so aus (äusserst hässlicher Code, da mir keine sauberere Variante eingefallen ist):
versteckter Inhalt:
Code: Alles auswählen
document.body.innerHTML = document.body.innerHTML.replace(
/<tr>\n\t\t\t\t\t<td class=\"row3\" colspan=\"6\"><b class=\"gensmall\">Bekanntmachungen[^]*<b class=\"gensmall\">Themen.*\n.*\n.*\n.*\n.*\n.*\n.*\n/, "");
Generelles aufräumen im Header- und Footer-Bereich der Page übernimmt dieser Code, der aber für viele wohl zu weit gehen dürfte, da er ziemlich rustikal alles wegräumt, was ich persönlich für sinnlos erachte:
versteckter Inhalt:
Code: Alles auswählen
document.getElementById('qm-page-border').style.width = '100%';

document.getElementById('qm-companynav').style.display = "none";
document.getElementById('qm-ticker').style.display = "none";
document.getElementById('datebar').style.display = "none";

document.body.innerHTML = document.body.innerHTML.replace(/<p class=\"searchbar[^]*\t<br style.*\n/, "");

var elems = document.getElementsByClassName('datetime');
for(var i = 0; i < elems.length; i++) {
    elems[i].style.display = "none";
}

document.body.innerHTML = document.body.innerHTML.replace(/<div style=.margin:30[^]*/, "</body></html>");
Den Hauptteil meiner Arbeit habe ich aber in den folgenden Code gesteckt und zuerst eigentlich gedacht, dass das gar nicht möglich wäre, aber mit sehr viel Geduld und herumprobieren ist es mir schlussendlich doch gelungen (und das am Ende sogar ohne 100te von Codezeilen sondern ziemlich kompakt). Und zwar nervte es mich immer, dass nach dem Abschicken eines Postings man zuerst noch auf eine so unnötige Zwischenseite weitergeleitet wird, statt direkt zurück zum Thread. Vor allem bei der Quickreply finde ich das enorm störend, weil es dort überhaupt keinen Grund gibt, nicht direkt im Thread zu bleiben und die eigene Antwort sofort dort anzuhängen.

Deshalb hier nun also Code der dafür sorgt, dass man bei einer Quickreply direkt im Thread bleibt:
versteckter Inhalt:
Code: Alles auswählen
var quick = document.getElementById('quickreply');
if (quick != undefined && quick.parentNode != undefined) {
  // always show quickreply
  quick.style.display = "";

  // replace functionality of button "Absenden"
  quick.getElementsByClassName('btnmain')[0].onclick = function () {
    var params = 'subject=' + encodeURIComponent(document.getElementsByName('subject')[0].value) + '&';
    params += 'message=' + encodeURIComponent(document.getElementsByName('message')[0].value) + '&';
    var inputs = quick.getElementsByTagName('tr')[2].getElementsByTagName('td')[0].getElementsByTagName('input');
    for(var i = 0; i < inputs.length; i++) {
      params += inputs[i].name + '=' + inputs[i].value + '&';
    }
    var req = new XMLHttpRequest();
    req.open('POST', quick.parentNode.action, false);
    req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    req.send(params);
    if (req.status == 200 && req.responseText.indexOf('Antwort erstellen') == -1)  {
      var newUrl = req.responseText.substring(req.responseText.indexOf('3;url=') + 6);
      location.href = newUrl.substring(0, newUrl.search('"')).replace(/&/g, '&');
      return false;
    }
  }
}
Und mit diesem Code kommt man beim Abschicken einer regulären Antwort (oder nach dem Editieren eines Postings) direkt zurück in den Thread ohne die Zwischenseite (Dateianhänge sowie die Zusatzoptionen, die man unter der Antwort noch anhäkeln kann, sind vorerst aber noch nicht unterstützt, die habe ich in all den Jahren hier im Forum aber auch noch nie gebraucht):
versteckter Inhalt:
Code: Alles auswählen
var form = document.postform;
if (form != undefined) {
  // replace functionality of buttons "Absenden"
  for (var i = 0; i < form.post.length; i++) {
    form.post[i].onclick = function () {
      var params = 'subject=' + encodeURIComponent(form.subject.value) + '&';
      params += 'message=' + encodeURIComponent(form.message.value) + '&';
      params += 'creation_time=' + form.creation_time.value + '&';
      params += 'form_token=' + form.form_token.value + '&';
      if (form.topic_cur_post_id != undefined) {
        params += 'topic_cur_post_id=' + form.topic_cur_post_id.value + '&';
      }
      if (form.edit_post_message_checksum != undefined) {
        params += 'edit_post_message_checksum=' + form.edit_post_message_checksum.value + '&';
      }
      if (form.edit_post_subject_checksum != undefined) {
        params += 'edit_post_subject_checksum=' + form.edit_post_subject_checksum.value + '&';
      }
      params += 'lastclick=' + form.lastclick.value + '&post=Absenden';

      var req = new XMLHttpRequest();
      req.open('POST', form.action, false);
      req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      req.send(params);
      if (req.status == 200 && req.responseText.indexOf('Antwort erstellen') == -1)  {
        var newUrl = req.responseText.substring(req.responseText.indexOf('3;url=') + 6);
        location.href = newUrl.substring(0, newUrl.search('"')).replace(/&/g, '&');
        return false;
      }
    }
  }
}
Wem in den letzten Wochen ab und zu mal sinnlose Test-Posting von mir hier in diesem Thread aufgefallen sind, die nach wenigen Sekunden wieder weg waren, der weiss jetzt wozu die gut waren...

Ich habe das auch alles so gut wie möglich getestet (aber nur im Firefox, also falls andere Browser Probleme machen, dann meldet euch) und in letzter Zeit nie mehr Probleme gehabt, trotzdem übernehme ich natürlich keinerlei Haftung für allfällig beim Abschicken verloren gehende Postings. Ich kann nur sagen, dass ich den Code selbst verwende und ihm mittlerweile vertraue... :wink:

In diesem File habe ich alle Codeteile zusammengefasst plus dazu noch den Doppelklick-Code von Nerdus (inkl. einem kleinen Fix, denn bisher wurde der blaue Rand auf der rechten Seite des Threads nach dem Doppelklick nie ausgeblendet):
https://fileload.info/2205oqlr80n1/qtalk.txt.html
#1289835
Sorry für den Doppelpost, aber ich habe gemerkt, dass am Freitag in obigem (sowieso schon überlangen) Posting noch ein Punkt vergessen gegangen ist.

@Nerdus:
Wäre es möglich, dein Doppelklick-Skript so anzupassen, dass Ctrl+Klick wieder den Thread in einem neuen Tab öffnet (wie ohne Skript) statt im gleichen Tab? Ich habe es selbst versucht anzupassen, es ist mir aber nicht gelungen...
Benutzeravatar
von Nerdus
#1289926
little_big_man hat geschrieben:In den letzten ca. 2 Monaten habe ich nebenbei immer mal wieder an noch einigen Zusatzfunktionen gebastelt, die mir noch so in den Sinn gekommen sind. Da ich aber kaum Erfahrung mit Webentwicklung habe und auch nie mehrere Stunden am Stück daran gearbeitet habe, hat das alles etwas lange gedauert. Primär habe ich das natürlich für mich selbst gemacht, einerseits einfach aus Interesse am Programmieren und andererseits, weil es das Surfen hier im Forum für mich bequemer macht. Aber da ev. auch andere daran Interesse haben, präsentiere ich hier mal mein Ergebnis.
Schöne Sache :D
little_big_man hat geschrieben:@Nerdus:
Wäre es möglich, dein Doppelklick-Skript so anzupassen, dass Ctrl+Klick wieder den Thread in einem neuen Tab öffnet (wie ohne Skript) statt im gleichen Tab? Ich habe es selbst versucht anzupassen, es ist mir aber nicht gelungen...
Gute Frage,benutze die Kombination normalerweise nie, deshalb ist es mir nicht aufgefallen. Müsste bestimmt machbar sein, werd’s mir (zusammen mit deinen Ergänzungen) die Tage mal anschauen :D
#1289945
Nerdus hat geschrieben:Gute Frage,benutze die Kombination normalerweise nie, deshalb ist es mir nicht aufgefallen. Müsste bestimmt machbar sein, werd’s mir (zusammen mit deinen Ergänzungen) die Tage mal anschauen :D
Cool. Ist jetzt nicht die wichtigste Tastenkombination, aber ich war mir das seit Jahren so gewöhnt manchmal Threads zum später lesen in einem neuen Tab zu öffnen auf diese Art....und mir das abzugewöhnen, seit das nicht mehr klappt, ist mir bis heute noch nicht gelungen... :wink:

(Die umständlichere Alternative ist einfach Rechtsklick+"Neues Tab öffnen".)
Benutzeravatar
von Nerdus
#1290690
little_big_man hat geschrieben:@Nerdus:
Wäre es möglich, dein Doppelklick-Skript so anzupassen, dass Ctrl+Klick wieder den Thread in einem neuen Tab öffnet (wie ohne Skript) statt im gleichen Tab? Ich habe es selbst versucht anzupassen, es ist mir aber nicht gelungen...
Hab es mir gerade mal angesehen, scheint aber doch etwas kniffliger zu sein.
Es lässt sich ganz einfach abfragen, ob es ein normaler Klick oder eine Kombination mit der Ctrl-Taste ist, leider gibt es keine verlässliche Möglichkeit, per Javascript einen neuen Tab im Hintergrund zu öffnen. Man kann den Link nur in einem neuen Fenster öffnen lassen und im Browser einstellen, dass in so einem Fall eben ein Tab geöffnet werden soll und kein Fenster – aber der Tab wird dann immer im Vordergrund geöffnet.

Ansonsten gibt es noch prinzipiell die Möglichkeit, zwischen Klicks und Doppelklicks zu unterscheiden (dann müsste man gar nicht erst die normale Klick-Funktion überschreiben) – aber natürlich werden bei einem Doppelklick immer beide Events ausgelöst, der normale Klick genau wie der Doppelklick, da kommt man also auch nicht weit …

Ich schau mal noch ein bisschen.