Bagaimana evaluateJavascript bekerja?
I'm mencoba untuk menggunakan yang baru evaluateJavascript metode di Android 4.4, tapi semua yang pernah saya dapatkan kembali adalah null hasilnya:
webView1.evaluateJavascript("return \"test\";", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Log is written, but s is always null
}
});
Bagaimana saya mengembalikan hasil untuk metode ini?
Update: Sedikit info lebih lanjut:
- Aku memiliki izin INTERNET set
- Saya memiliki
setJavascriptEnabled(true);
- Mencoba apostrophe string:
kembali 'test';
, - Mencoba JS objek:
kembali { tes: 'ini' }
konsol.log('test');
sedang dijalankan baik-baik saja.- Set
targetSdkVersion
ke 19 sebagai per: Jika aplikasi anda menggunakan WebView
Perangkat: Kedua Nexus 7 dan Nexus 5 (Saham)
45
5
Ada contoh evaluateJavascript metode yang digunakan dalam contoh ini:
https://github.com/GoogleChrome/chromium-webview-samples/tree/master/jsinterface-example
Pada dasarnya jika javascript anda jalankan di WebView mengembalikan nilai itu'akan berlalu di balik.
Hal utama yang perlu diperhatikan adalah bahwa String yang dikembalikan dalam OnReceiveValue adalah berupa JSON Nilai, Objek JSON atau JSON Array tergantung pada apa yang anda kembali.
Hal-hal yang perlu diperhatikan tentang hal ini jika anda mengembalikan nilai tunggal, anda perlu menggunakan setLenient(benar) pada JSON reader untuk itu untuk bekerja.
Alasan anda mungkin masih ingin menggunakan parser untuk string respon itu dikonversi ke JSON nilai yang berarti itu akan dibungkus dalam tanda kutip.
Misalnya jika anda pergi:
Ini akan mencetak string ini, dibungkus dengan tanda kutip ganda: "ini".
Contoh lain yang patut dicatat:
OK, jadi ternyata
hasil
di sini adalah hasil dari Javascript panggilan - seperti jika seseorang memasukkan perintah ke dalam konsol Javascript.Jadi dalam rangka untuk mendapatkan hasil, itu harus dibungkus dalam sebuah fungsi:
Ini juga akan bekerja:
Metode ini juga menangani objek Javascript:
AndroidJSCore adalah alternatif yang baik untuk mengevaluasi JavaScript yang tidak menggunakan WebView.
Jika anda ingin tetap dengan WebView dan perlu untuk mengevaluasi JavaScript pada versi sebelumnya (Android 4+), berikut adalah sedikit perpustakaan:
https://github.com/evgenyneu/js-evaluator-for-android
Untuk meringkas jawaban dari @GauntFace dan memberikan alternatif solusi tanpa menggunakan JSON parser:
Jika anda JS kembali fungsi hanya
String
dan're-tanya tentang mengapa string hancur di pulau Jawa, it's karena itu's JSON-lolos.(perhatikan bahwa
onReceiveValue
menyediakanString
sementara JS fungsi dapat mengembalikannull
, Sejumlah literal dll.)Untuk mendapatkan nilai string yang sama seperti di JS, jika anda'kembali 100% yakin anda're mengharapkan tepat
String
kembali, kau'd perlu JSON-unescape itu, misalnya seperti:Namun, perhatikan bahwa
s
mungkin string"null"
jika JS kembali tepatnull
, jadi anda jelas perlu memeriksa bahwa sebagai langkah pertama.Semua orang's jawaban yang lebih besar. Saya hanya menambahkan satu poin lagi. Don't menempatkan evaluateJavascript dalam metode dengan @JavascripInterface penjelasan seperti ini cara
@JavascripInterface public void onData(){ mWebView.evaluateJavascript("javascript:executeNext()",null); }
Karena itu akan memblokir JavaBridge Benang. jika anda ingin menempatkan evaluateJavascript di dalamnya. Melakukannya dengan cara ini `` @JavascripInterface public void onData(){ mWebView.posting(new Runnable() { @Override public void run() { mWebView.evaluateJavascript("javascript:executeNext()",null); } });} ``