Injecter un JS < - >JavaFX bringe à WebView lors du chargement de la page


J'ai besoin d'injecter un objet bridge avant le début de l'exécution JavaScript (ou, au moins, avant que document.onready ne soit déclenché). La solution la plus fréquente ne le fournit pas:

engine.getLoadWorker().getStateProperty().addListener(new ChangeListener<State> {
    @Override
    public void changed(ObservableValue<? extends State> val, State oldV, State newV) {
        if (newV == State.SUCCEEDED) {
            System.out.println("getLoadWorker.stateProperty changed to " + newV + ", injecting an API!");
            ((JSObject) engine.executeScript("window")).setMember("api", new SomeApi());
        }
    }
});

Mais un cas de test simple montre que JavaScipt est appelé avant que la transition d'état ne se produise:

alert("Loaded! typeof(api) == '" + typeof(api) + "'");
$(document).ready(function() {
    alert("Ready! typeof(api) == '" + typeof(api) + "'");
});

Cet exemple produit quelque chose comme:

[JS alert] Loaded! typeof(api) == 'undefined'
[JS alert] Ready! typeof(api) == 'undefined'
getLoadWorker.stateProperty changed to SUCCEEDED, injecting an API!

Une autre réponse suggérée (https://stackoverflow.com/a/28414332/1848172) semble fonctionner, mais ressemble à un hack laid. Y a t il du propre la solution?

Author: Community, 2015-12-26

1 answers

La réponse que vous avez mentionnée ne fonctionne que si vous avez accès à la source de la page, car vous devez y injecter votre état magique.

Une autre façon laide consiste à charger une page HTML locale, ce qui est essentiel un iFrame dans lequel vous chargez ensuite le contenu. De cette façon, vous pourrez peut-être injecter votre javascript dans la page chargée localement et ensuite charger la page réelle via JavaScript. Cependant tout dépend du JavaScript que vous souhaitez exécuter.

 1
Author: hotzst, 2017-05-23 12:15:47