दिलचस्प पोस्ट
पीजी अपरिभाषित त्रुटि संबंध उपयोगकर्ता मौजूद नहीं है क्या वैध है और क्या यूआरआई क्वेरी में नहीं है? रनटाइम पर पायथन संस्करण का पता लगाएं नक्शा () और सूची की समझ के परिणाम अलग क्यों हैं? प्रोग्राममैटिक ट्रिगरिंग टाइपआहेड। जेएस परिणाम डिस्प्ले dyld: पुस्तकालय लोड नहीं किया गया: @ rpath / libswiftCore.dylib / Image नहीं मिला एंड्रॉइड स्टूडियो: नया बनाया गया निर्देशिका फ़ोल्डर दृश्य में दिखाई नहीं दे रहा है मैं रेल में एक तिथि कैसे सत्यापित करूं? एंड्रॉइड लिस्ट्यूव्यू रीफ्रेश सिंगल रो ग्राहक मॉडल का सर्वोत्तम तरीका <-> पता पॉइंटर के माध्यम से सी और सी ++ में फ़ंक्शन से स्थानीय डेटा रिटर्न करना रूबी की छिपी हुई विशेषताओं प्लगइन सिस्टम कैसे काम करता है (वर्डप्रेस, मायबब …)? मैं कक्षा के बजाय एक स्ट्रैट का उपयोग कब करना चाहिए? एंड्रॉइड 5.0 (लॉलीपॉप) में इनकमिंग कॉम को प्रोग्रामैटिक रूप से कैसे उत्तर दिया जा सकता है?

जावास्क्रिप्ट काम का मूल्यांकन कैसे करता है?

मैं एंड्रॉइड 4.4 में नए मूल्यांकन जावास्क्रिप्ट पद्धति का उपयोग करने की कोशिश कर रहा हूं, लेकिन मैं कभी भी वापस पाने के लिए एक नल परिणाम है:

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

मैं इस पद्धति में परिणाम कैसे प्राप्त करूं?

अद्यतन: थोड़ा सा और जानकारी:

  1. मेरे पास इंटरनेट अनुमति सेट है
  2. मैंने setJavascriptEnabled(true);
  3. अप्रास्ट्रॉफ़ स्ट्रिंग की कोशिश की गई: return 'test'; ,
  4. जेएस वस्तु की कोशिश की: return { test: 'this' }
  5. console.log('test'); ठीक से निष्पादित किया जा रहा है
  6. targetSdkVersion संस्करण 1 के अनुसार निर्धारित करें: यदि आपका ऐप WebView का उपयोग करता है

डिवाइस: नेक्सस 7 और नेक्सस 5 (स्टॉक) दोनों

Solutions Collecting From Web of "जावास्क्रिप्ट काम का मूल्यांकन कैसे करता है?"

इस नमूने में जावास्क्रिप्ट पद्धति का मूल्यांकन करने का एक उदाहरण है:

https://github.com/GoogleChrome/chromium-webview-samples/tree/master/jsinterface-example

मूलतः यदि आपके द्वारा WebView में निष्पादित जावास्क्रिप्ट एक मान देता है तो इसे कॉलबैक में पास किया जाएगा।

नोट करने के लिए मुख्य बात यह है कि स्ट्रिंग पर लौट आए OnreceiveValue या तो एक JSON मान, JSON ऑब्जेक्ट या JSON सरणी है कि आप क्या वापसी के आधार पर।

इसके बारे में ध्यान देने वाली बात यह है कि यदि आप एक एकल मान वापस करते हैं, तो आपको इसके लिए जेसनसन रीडर पर सेट लेन्एन्ट (सच्चा) का उपयोग करना होगा।

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

इसका कारण है कि आप अभी भी एक स्ट्रिंग रिस्पांस के लिए पार्सर का उपयोग करना चाहते हैं, यह एक JSON मान में कनवर्ट किया जाता है जिसका अर्थ यह उद्धरण में लिपटेगा।

उदाहरण के लिए यदि आप गए:

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

यह स्ट्रिंग प्रिंट करेगा, डबल कोट्स में लिपटेगा: "यह"।

नोटिंग के अन्य उदाहरण:

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

ठीक है, तो यह पता चला है कि result यहां जावास्क्रिप्ट कॉल का परिणाम है – जैसे कि कोई जावास्क्रिप्ट कंसोल में कमांड दर्ज कर रहा है

इसलिए परिणाम प्राप्त करने के लिए, इसे किसी फ़ंक्शन में लपेटा जाना चाहिए:

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

यह भी काम करेगा:

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

विधि जावास्क्रिप्ट ऑब्जेक्ट भी संभालती है:

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

एंड्रॉएड जेस्कोर जावास्क्रिप्ट का मूल्यांकन करने के लिए एक अच्छा विकल्प है, जो कि किसी वेबविवे का उपयोग नहीं करता है।

यदि आप WebView के साथ रहना चाहते हैं और एंड्रॉइड (4+) के पिछले संस्करणों पर जावास्क्रिप्ट को मूल्यांकन करने की आवश्यकता है, तो यहां एक छोटी लाइब्रेरी है:

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

@ गोंटफेस के उत्तर को संक्षेप करने के लिए और JSON पार्सर का उपयोग किए बिना एक वैकल्पिक समाधान प्रदान करें:

यदि आपका जेएस फ़ंक्शन केवल एक String और आप सोच रहे हैं कि स्ट्रिंग जावा में क्यों उलझा हुआ है, तो यह इसलिए है क्योंकि यह JSON-escaped है।

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

(ध्यान दें कि onReceiveValue हमेशा एक String प्रदान करता है, जबकि जेएस फ़ंक्शन एक null , एक संख्या शाब्दिक आदि लौटा सकता है)

स्ट्रिंग मान को जेएस के समान ही प्राप्त करने के लिए, यदि आप 100% यकीन है कि आप एक उचित String उम्मीद कर रहे हैं, तो आपको इसे JSON-unescape की आवश्यकता होगी, उदाहरण के लिए:

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

हालांकि, ध्यान दें कि s स्ट्रिंग "null" हो सकता है यदि जेएस रिटर्न उचित null , तो आपको स्पष्ट रूप से यह देखना होगा कि पहले चरण के रूप में

 if ("null".equals(s)) { ... } else { // unescape JSON }