Android - so laden Sie externe javascript-Dateien innerhalb von zur Laufzeit generierten HTML-Daten?
Ich habe eine WebView mit HTML-Daten. Die Daten werden zur Laufzeit generiert. Eines der wichtigsten Features von my app ist, wobei bestimmte Teile des HTML-Daten. Ich habe versucht, dies durch die Verwendung von javascript.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_reader_page, container, false);
webview = (WebView) rootView.findViewById(R.id.resultText);
webview.getSettings().setJavaScriptEnabled(true);
String page = makeHTML();
webview.loadUrl("file:///android_asset/jquery-1.8.2.js");
webview.loadUrl("file:///android_asset/src_javascript.js");
webview.loadData(page, "text/html", "UTF-8");
return rootView;
}
private String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE html>\n");
sb.append("<html>\n");
sb.append("<head>\n");
sb.append("</head>\n");
sb.append("<body>\n");
sb.append(tokenizedText + "\n");
sb.append("</body>\n");
sb.append("</html>\n");
return sb.toString();
}
tokenizedText
ist meine zur Laufzeit generierte Daten mit diesem format:
<YT_SEN id="_YT_SEN_0">This is my first sentence.</YT_SEN>
<YT_SEN id="_YT_SEN_1">This is my second sentence.</YT_SEN>
...
Wenn meine Daten, die geladen wird in der Webansicht kann der Benutzer markieren Sie einen bestimmten Satz durch Angabe der Anzahl. Diese Methode ruft dann die entsprechende javascript-Funktion:
public void highlightSentence(int sent_id) {
if (android.os.Build.VERSION.SDK_INT < 19) {
webview.loadUrl("javascript:highlightSentence('_YT_SEN_" +sent_id+ "', " +color+ ")");
} else {
webview.evaluateJavascript("javascript:highlightSentence('_YT_SEN_" +sent_id+ "', " +color+ ")", null);
}
}
Die javascript-Funktion für die Hervorhebung (definiert im inneren file:///android_asset/src_javascript.js):
function highlightSentence(object,color)
{
document.getElementById(object).style.backgroundColor = color;
}
Die Ausgabe von Logcat, wenn ich ausführen, die highlightSentence Methode:
I/chromium﹕ [INFO:CONSOLE(1)] "Uncaught ReferenceError: highlightSentence is not defined", source: (1)
Irgendwie die WebView nicht finden können, die highlightSentence Funktion. Ich denke, es ist wegen der Art, wie ich laden Sie die Javascript-und JQuery-Dateien. Doch ich weiß nicht (und kann nicht finden) die richtige Art und Weise zu laden externe js-Dateien innerhalb von zur Laufzeit generierten HTML-Daten.
Hinweis: ich benutze die WebView, die ausschließlich für die offline-Nutzung, ich habe keine Notwendigkeit für eine internet-Kommunikation zu löschen. WebView schien der einfachste Weg zu ermöglichen, die dynamische Hervorhebung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es, die Javascript-same-origin-policy ist die Wurzel des Problems. Die WebView wird nur das laden von javascript-Dateien, die sind vom gleichen Ursprung wie das html. Da keine Herkunft für die html-gegeben wurde, die Daten-Schema als Vorgabe verwendet. Wenn jedoch die Daten, die geladen wird, mit der gleichen Basis-url, da die javascript-Dateien, kein problem entsteht.
Laden Sie die html-Daten (mit
file:///android_asset/javascript/
wird das Verzeichnis, das die javascript-Dateien):Dann Referenz, javascript-Dateien, wie diese im html-Code:
Vorausgesetzt, javascript ist im Verzeichnis "assets" Punkt-um es mit einem Datei-url -
file://android_asset/Punkte auf die Vermögens-Verzeichnis in der apk.
So können Sie auf das script in Ihre html -, wenn Sie es bauen, für die webview.
makeHTML()
Methode, doch jetzt bekomme ich die Fehlermeldung"Not allowed to load local resource
" für meine beiden JQuery und eine Javascript-Datei.