WKWebView - Javascript nach dem Laden der Seite ausführen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • WKWebView - Javascript nach dem Laden der Seite ausführen

    Hallo,

    ich brauche mal wieder eure Hilfe. In einer iOS App lade ich meine HTML-Hilfeseite in einem WKWebView, der im Interfacebuilder eingebaut wurde. Um an eine bestimmte Stelle in der Hilfe zu springen verwende ich folgenden Code.

    Quellcode

    1. mainBundle = [NSBundle mainBundle];
    2. NSMutableString *path = [[NSMutableString alloc] initWithString:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"Help"]];
    3. NSURL *baseURL = [NSURL fileURLWithPath:path];
    4. NSURL *fullURL = [NSURL URLWithString:_helpIndex relativeToURL:baseURL];
    5. _request = [NSURLRequest requestWithURL:fullURL];
    6. [_helpView loadRequest:_request];

    Das funktioniert auch für die ersten gesetzten Anchor's. Für weiter hintenliegenden Anchor's wird nicht mehr weit genug gesprungen. Wenn ich in

    Quellcode

    1. - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    2. NSLog(@"Finish load");
    3. }

    einen Breakpoint setze, sehe ich das zum richtigen Anchor gesprungen wird. Es werden aber zunächst einmal nur die Überschriften und die Bilder angezeigt. Nachdem ich run geklickt habe wird auch der Text angezeigt. Allerdings springt die Anzeige wieder Richtung Anfang, so dass nicht mehr das richtige Kapitel angezeigt wird.

    Meine Idee war nun nach vollständigem Laden der Seite ein Javascript, dass zum gewünschten Anchor springt, auszuführen. Leider habe ich kein funktionierendes Beispiel im Web gefunden.

    Ich hoffe das hier jemand einen Vorschlag hat wie ich dieses Problem lösen kann. Am liebsten bitte in ObjectiveC Code. Swift ist nicht so mein Ding.

    Gruß Berthold
  • Mir kommt das Anhängen des Anchors in der 4. Zeile komisch vor, bist Du sicher, dass in fullURL danach wirklich die komplette Adresse inkl. Anchor steht?

    Ich würde die URL über ihre Komponenten zusammensetzen und dabei den Anchor als fragment setzen. Der Weg über das JavaScript bekämpft m. E. nur das Symptom, ist aber keine Lösung des eigentlichen Problems.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke für die Hinweise. Leider klappt das immer noch nicht. Obwohl ich es auch mit NSURLComponents versucht habe. Oder mache ich doch noch etwas falsch???
    path enthält den String zur Hilfe datei .../index.html _helpindex enthält das Kapitel wo ich hinspringen möchte #section2-9

    Quellcode

    1. _urlComponents = [[NSURLComponents alloc] initWithString:path];
    2. [_urlComponents setFragment:_helpIndex];
    3. NSURL *fullURL = [NSURL URLWithString:[_urlComponents string]];
    4. _request = [NSURLRequest requestWithURL:fullURL];
    5. [_helpView loadRequest:_request];

    Ergebnis:
    /Users/berthold/Library/Developer/CoreSimulator/Devices/4C0148D9-7FAD-4E15-BB36-6733C951DA30/data/Containers/Bundle/Appl ... ction2-9

    Das Appl ... ction2-9 kann nicht stimmen.

    Meine Ursprungsversion

    Quellcode

    1. NSURL *baseURL = [NSURL fileURLWithPath:path];
    2. NSURL *fullURL = [NSURL URLWithString:_helpIndex relativeToURL:baseURL];
    3. _request = [NSURLRequest requestWithURL:fullURL];

    Ergebnis mit NSLog:
    #section2-9 -- file:///Users/berthold/Library/Developer/CoreSimulator/Devices/4C0148D9-7FAD-4E15-BB36-6733C951DA30/data/Containers/Bundle/Application/168B135C-45CA-4192-862A-AA299F9134A9/Regalcheck.app/Help/index.html

    Dies funktioniert wenn die HTML-Datei nicht zu groß ist. Die ersten Anchor's lassen sich ansteuern, weiter hinten liegende nicht.

    Wenn path die gesamte URL mit #section2-9 als String verwendet. Ergebnis:

    file:///Users/berthold/Library/Developer/CoreSimulator/Devices/4C0148D9-7FAD-4E15-BB36-6733C951DA30/data/Containers/Bundle/Application/0C2D3CCE-41B4-4A42-A7BD-850A13808335/Regalcheck.app/Help/index.html%23section2-9
    Statt der # wird %23 in den String eingefügt.

    Das ein Javascript nicht die saubere Lösung ist, ist mir schon klar. Dennoch wüßte ich gerne wie man ein Script nach dem Laden der Seite ausführt.

    Wenn das alles nicht klappt, werde ich die Hilfedatei in mehrere html-Dateien splitten, da der Fehler ja erst bei längeren html-Dateien auftritt.

    Gruß Berthold
  • Berthold schrieb:

    Quellcode

    1. _urlComponents = [[NSURLComponents alloc] initWithString:path];
    2. [_urlComponents setFragment:_helpIndex];
    3. NSURL *fullURL = [NSURL URLWithString:[_urlComponents string]];
    4. _request = [NSURLRequest requestWithURL:fullURL];
    5. [_helpView loadRequest:_request];
    Du bastelst zu viel mit Strings herum, dann kommt Dir schnell ein Encoding etc. in die Query. Warum nicht sauber die URLComponents setzen und daraus die URL erstellen? Etwas in der Art wie dies - ungetestet:

    Quellcode

    1. NSURLComponents *components = [[NSURLComponents alloc] initWithString:path];
    2. components.fragment = _helpIndex;
    3. NSURL *fullURL = components.URL;
    Mattes

    P.S.: Warum verwendest Du laufend iVars ... oder wie sind die Variablennamen mit Underscore zu verstehen?
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Mein Problem ist gelöst. Hier findet ihr ein leicht anpassbaren Beispiel, dass Javascript in einem WKWebView ausführen kann. Wenn andere Quellen richtig liegen, funktioniert dies nicht wenn der WKWebView im Interfacebuilder erstellt wurde. Warum der Sprung zu anchor's nur am Anfang eines HTML-Files funktioniert kann ich leider nicht sagen. Der Versuch das HTML-File zu splitten hat ebenfalls nichts gebracht.
    Dank Javascript funktioniert jetzt alles.

    Gruß Berthold