2 Stimmen

window.scrollto javascript-Aufruf an uiwebview verhält sich falsch

Ich habe mehrere uiwebviews mit einer beträchtlichen Menge an Text. wenn ein window.scrollto (sowie ein window.scroll) Javascript-Aufruf an die Webviews, sie scrollen zu einer falschen Position. z.B. ich möchte zu 12000 scrollen, aber die Webview wird zu 10149 jedes Mal stattdessen scrollen. während ein anderes zu 10250 scrollen wird. noch eine andere, die ich zu 22000 oder so scrollen möchte wird zu 20230 jedes Mal stattdessen scrollen.

dies geschieht nur auf dem Gerät und nicht im Simulator.

Ich mache den Aufruf in webViewDidFinishLoad.

Ich habe versucht, den Aufruf mehrere Male mit keine besseren Ergebnisse. Es scheint, dass was auch immer Wert der bestimmten Webview scrollt, um die weiteste es gehen kann, wenn Sie den scrollto-Aufruf verwenden. es gibt kein Problem, wenn es einen geringeren Wert zu blättern. es ist nur, wenn Sie diese magische Zahl übergeben, was auch immer es für diese Webview ist, es wird nicht weiter gehen.

jeder Beitrag wäre sehr willkommen

0 Stimmen

Danke, dass Sie das fragen. Ich habe meinen Kopf gegen die Wand geschlagen, um das herauszufinden.

1voto

cduhn Punkte 17688

Das kann unter anderem passieren, wenn Sie in Ihrem Markup auf Bilder verweisen, ohne deren Größe explizit anzugeben. Ihre Bilder sind wahrscheinlich noch nicht fertig geladen, wenn webViewDidFinishLoad: aufgerufen wird. Der Browser baut die Seite zunächst mit einer angenommenen Bildgröße auf. Sobald das Bild geladen ist und der Browser seine tatsächlichen Abmessungen ermitteln kann, wird die Seite neu umbrochen, wodurch sich die Gesamthöhe der Seite erhöhen kann. Wenn Ihr window.scrollTo-Aufruf vor diesem Neuumbruch erfolgt, versuchen Sie möglicherweise, über das Ende des Dokuments hinaus zu scrollen.

Wenn dies in Ihrem Fall der Fall ist, können Sie das Problem lösen, indem Sie die Abmessungen Ihrer img-Tags explizit in Ihrem Markup oder CSS angeben.

Wenn Sie aus irgendeinem Grund die Bildabmessungen nicht im Voraus vorhersagen können, können Sie Ihren window.scrollTo-Aufruf aufschieben, bis die Bilder fertig geladen sind, indem Sie einen Javascript-Ereignishandler für window.onload registrieren, der nicht ausgelöst wird, bis alle Bilder fertig geladen sind. In der Event-Handler, navigieren Sie Ihre window.location.href auf einige gefälschte URL wie "app:imagesFinishedLoading". In Ihrem UIWebViewDelegate können Sie webView:shouldStartLoadWithRequest:navigationType: implementieren, um diese Navigation abzufangen, sie abzubrechen und dann Ihren Aufruf von window.scrollTo zu machen.

0 Stimmen

Vielen Dank für den Vorschlag. Ich hatte an einem Punkt vermutet, dass das Problem mit Bildern zu tun hatte, aber es trat mit Seiten, die tat und nicht enthalten sie. Ich fand tatsächlich, dass das Problem aufgrund von mir die scrollTo-Funktion zu früh aufgerufen wurde (obwohl ich es in webViewDidFinishLoad aufgerufen, die ich angenommen würde nur aufgerufen werden, sobald die Seite vollständig fertig geladen wurde, und visuell zumindest schien es zu sein). so habe ich in einen Timer, um die scrollTo-Methode 300 Millisekunden später aufgerufen haben, und das kümmerte sich um es.

0 Stimmen

Ja, webViewDidFinishLoad ist trügerisch. Ich habe festgestellt, dass Javascript auf der Seite eingebettet hat in der Regel nicht durch die Zeit webViewDidFinishLoad aufgerufen wird interpretiert, so dass ich hatte, um eine Nachricht von JS zu ObjC über webView:shouldStaqrtLoadWithRequest:navigationType auf ein paar verschiedene Anwendungen zu senden.

1voto

ilyashev Punkte 371

So fand ich, dass das Problem durch mich Aufruf der scrollTo-Funktion zu früh war (obwohl ich es in webViewDidFinishLoad aufgerufen, die ich angenommen würde nur aufgerufen werden, sobald die Seite vollständig fertig geladen wurde, und visuell zumindest schien es zu sein). ich legte in einen Timer, um die scrollTo-Methode 300 Millisekunden später aufgerufen haben, und das kümmerte sich um es.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X