[gelöst]FW_okDialog() springt immer zum Anfang der Seite

Begonnen von mumpitzstuff, 19 April 2018, 00:58:39

Vorheriges Thema - Nächstes Thema

mumpitzstuff

Ich habe mir eine ReadingsGroup gebaut, in der man durch Klick auf einen Eintrag einen Dialog mit erweiterten Informationen öffnen kann. Das klappt sehr gut, wenn sich die ReadingsGroup am Anfang der Seite befindet. Steht sie aber weiter unten in einem Raum, so das man Scrollen muss und man öffnet dann einen Dialog mit FW_okDialog(), dann springt die Webseite immer ganz nach oben und man muss erst wieder runter scrollen, um den Dialog zu sehen.

"<a href=\"#\" onclick=\"FW_okDialog('".$stitle."<br><br>".$desc."')\">".$title."</a>"

Als zweiten Parameter kann man hier ein Parent angeben, mir ist aber nicht klar, was damit gemeint ist bzw. was ich hier angeben soll:

parent (optional): Ein Objekt zur Verankerung des Popup-Fensters, default ist das body-Element. Eine FHEM-Widget-Schnittstelle wird interpretiert.

Hat dazu jemand eine Idee?

mumpitzstuff

Ich habe das hier im Code der Funktion gefunden:

var oldPos = $("body").scrollTop();
setTimeout(function(){$("body").scrollTop(oldPos);}, 1); // Not ideal.


Vermutlich sorgt das dafür, das erst zum Anfang gescrollt wird, dann aber nicht mehr zurück an die alte Position. Bin leider kein Experte was HTML Zeugs angeht...

mumpitzstuff

#2
Ich habe des Rätsels Lösung gefunden! href sollte nicht # enthalten, sondern etwas das garantiert nicht als Anchor auf der Webseite vorhanden ist, also z.B. #! oder #qgdbhdsduzadtgufafhqwjAOHSDHF. In diesem Fall wird kein Pagereload gemacht und damit geht die aktuelle Scrollposition auch nicht verloren. Das Problem scheint es übrigens nur zu geben, wenn man FW_okDialog aus einem a Tag heraus aufruft. Das sichern der Scrollposition und zurücksetzen der Scrollpostion ist in diesem Fall sinnlos, da oldPos immer 0 ist, wahrscheinlich weil bereits gescrollt wurde, bevor onclick überhaupt ausgeführt wird.

Das Ganze sieht dann so aus:

<a href=\"#!\" onclick=\"FW_okDialog('".$stitle."<br><br>".$desc."')\">".$title."</a>

Davon abgesehen sollte die Funktion FW_okDialog() vielleicht wie folgt geändert werden, da ich nicht glaube, das die Lösung mit dem Timeout sauber ist:

function
FW_okDialog(txt, parent, removeFn)
{
  var div = $("<div id='FW_okDialog'>");
  $(div).html(txt);
  $("body").append(div);
  var oldPos = $("body").scrollTop();
  $(div).dialog({
    dialogClass:"no-close", modal:true, width:"auto", closeOnEscape:true,
    maxWidth:$(window).width()*0.9, maxHeight:$(window).height()*0.9,
    buttons: [{text:oldPos, click:function(){
      $(this).dialog("close");
      if(removeFn)
        removeFn();
      $(div).remove();
    }}],
    // das müsste das Gleiche wie das Timeout unten machen...
    open:function(event, ui){
      $("body").scrollTop(oldPos);
    }
  });

  FW_replaceWidgets(div);
  $(div).find("a").each(function(){FW_replaceLink(this);}); //Forum #33766

  if(parent)
    $(div).dialog( "option", "position", {
      my: "left top", at: "right bottom",
      of: parent, collision: "flipfit"
    });
  // die Funktion ist vielleicht im Event open besser aufgehoben...
  //setTimeout(function(){$("body").scrollTop(oldPos);}, 1); // Not ideal.
}


PS: Ich habe mir erlaubt die Wiki Page entsprechend anzupassen und das Beispiel mit dem Hyperlink aufzunehmen.