de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 CodingIntrigue
CodingIntrigue
Question

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:

  1. Aku memiliki izin INTERNET set
  2. Saya memiliki setJavascriptEnabled(true);
  3. Mencoba apostrophe string: kembali &#39;test&#39;;,
  4. Mencoba JS objek: kembali { tes: &#39;ini&#39; }
  5. konsol.log(&#39;test&#39;); sedang dijalankan baik-baik saja.
  6. Set targetSdkVersion ke 19 sebagai per: Jika aplikasi anda menggunakan WebView

Perangkat: Kedua Nexus 7 dan Nexus 5 (Saham)

45 2013-11-05T11:50:08+00:00 5
 CodingIntrigue
CodingIntrigue
Pertanyaan edit 5 November 2013 в 1:22
Pemrograman
android
android-webview
android-4.4-kitkat
Solution / Answer
Matt Gaunt
Matt Gaunt
4 Desember 2013 в 2:23
2013-12-04T14:23:56+00:00
Lebih
Sumber
Sunting
#22718232

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.

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        // In KitKat+ you should use the evaluateJavascript method
        mWebView.evaluateJavascript(javascript, new ValueCallback<String>() {
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            @Override
            public void onReceiveValue(String s) {
                JsonReader reader = new JsonReader(new StringReader(s));

                // Must set lenient to parse single values
                reader.setLenient(true);

                try {
                    if(reader.peek() != JsonToken.NULL) {
                        if(reader.peek() == JsonToken.STRING) {
                            String msg = reader.nextString();
                            if(msg != null) {
                                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                } catch (IOException e) {
                    Log.e("TAG", "MainActivity: IOException", e);
                } finally {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        // NOOP
                    }
                }
            }
        });
    }

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:

mWebView.evaluateJavascript("(function() { return 'this'; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints: "this"
    }
});

Ini akan mencetak string ini, dibungkus dengan tanda kutip ganda: "ini".

Contoh lain yang patut dicatat:

mWebView.evaluateJavascript("(function() { return null; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints the string 'null' NOT Java null
    }
});

mWebView.evaluateJavascript("(function() { })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); //s is Java null
    }
});

mWebView.evaluateJavascript("(function() { return ''; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints "" (Two double quotes)
    }
});
 Sam
Sam
Jawaban edit 22 September 2017 в 3:54
65
0
 CodingIntrigue
CodingIntrigue
5 November 2013 в 2:06
2013-11-05T14:06:43+00:00
Lebih
Sumber
Sunting
#22718231

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:

webView1.evaluateJavascript("(function() { return \"this\"; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints 'this'
    }
});

Ini juga akan bekerja:

webView1.evaluateJavascript("window.variable = \"asd\";", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints asd
    }
});

Metode ini juga menangani objek Javascript:

webView1.evaluateJavascript("(function() { return { var1: \"variable1\", var2: \"variable2\" }; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints: {"var1":"variable1","var2":"variable2"}
    }
});
11
0
 Evgenii
Evgenii
15 Maret 2014 в 12:31
2014-03-15T00:31:14+00:00
Lebih
Sumber
Sunting
#22718233

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

jsEvaluator.evaluate("put your JavaScript code", new JsCallback() {
  @Override
  public void onResult(final String result) {
    // get result here (optional)
  }
});
 Evgenii
Evgenii
Jawaban edit 6 Desember 2016 в 1:13
8
0
 jakub.g
jakub.g
6 Juli 2017 в 1:13
2017-07-06T13:13:19+00:00
Lebih
Sumber
Sunting
#22718234

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.

mWebView.evaluateJavascript("(function() { return 'Earvin \"Magic\" Johnson'; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s);
        // expected: s == Earvin "Magic" Johnson
        // actual:   s == "Earvin \"Magic\" Johnson"
    }
});

(perhatikan bahwa onReceiveValue menyediakan String sementara JS fungsi dapat mengembalikan null, 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:

String unescaped = s.substring(1, s.length() - 1)  // remove wrapping quotes
                     .replace("\\\\", "\\")        // unescape \\ -> \
                     .replace("\\\"", "\"");       // unescape \" -> "

Namun, perhatikan bahwa s mungkin string "null" jika JS kembali tepat null, jadi anda jelas perlu memeriksa bahwa sebagai langkah pertama.

if ("null".equals(s)) {
   ...
} else {
   // unescape JSON
}
3
0
 littlebear333
littlebear333
26 Januari 2019 в 2:36
2019-01-26T02:36:21+00:00
Lebih
Sumber
Sunting
#22718235

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); } });

} ``

3
0
Related communities 1
Android Studio Indonesia
Android Studio Indonesia
1 778 pengguna
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 2 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi