दिलचस्प पोस्ट
ECMAScript6 तीर फ़ंक्शन जो एक ऑब्जेक्ट देता है सभी प्रकार के व्युत्पन्न प्रकार प्राप्त करें सेटरोटेशन (90) चित्र मोड में चित्र लेने के लिए सैमसंग उपकरणों पर काम नहीं करता है ArrayList क्लोन कैसे करें और इसकी सामग्री भी क्लोन करें? एक निर्भरता इंजेक्शन का उपयोग क्यों करता है? जावास्क्रिप्ट regex multiline झंडा काम नहीं करता है एंड्रॉइड सेवा गतिविधि के साथ संचार कैसे करें जावास्क्रिप्ट में = = _ मतलब क्या है आमज / एएमडी मॉड्यूल आयात करने के लिए नया ईएस 6 सिंटैक्स अर्थात् `आयात करें foo = की आवश्यकता है ('फू')` सी # में सूची के पहले एन तत्वों को कैसे प्राप्त करें? जावा: मजबूत / नरम / कमजोर / प्रेत संदर्भ में अंतर कैसे PHP, jQuery और AJAX का उपयोग कर एकाधिक फ़ाइलों को अपलोड करें कैसे एक opencv cv :: कन्वर्ट करने के लिए qimage करने के लिए Mat "गिट ने गैर-फास्ट फॉरवर्ड अपडेट्स को अस्वीकार कर दिया" इसका मतलब क्या है? उद्देश्य- c / कोको स्पर्श में एक मॉड्यूलो ऑपरेशन कैसे करें?

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

मैं एंड्रॉइड 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 (स्टॉक) दोनों

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

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

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 }