दिलचस्प पोस्ट
बैश में एक फ़ाइल से अंतिम पंक्ति निकालें सर्वश्रेष्ठ जावा ओब्बुस्केटेक्टर? टेबलव्यूव सेल कैसे हम छवि और लेबल के साथ तेजी से सेल का आकार बदलते हैं निर्भरता इंजेक्शन और एएसपी.Net सदस्यता प्रदाता क्या JAXB- एनोटेट किए गए वर्ग से एक्सएसडी उत्पन्न करना संभव है? INSTALL_FAILED_DUPLICATE_PERMISSION … C2D_MESSAGE "सर्वर टॉमकेट v7.0 सर्वर स्थानीयहोस्ट पर" स्टाक्स ट्रेस के बिना शुरू करने में विफल रहा, जबकि यह टर्मिनल में काम करता है जीकग्रीड में कॉलम मूल्य से जीएटी का उपयोग करते हुए एक नए पेज पर लिंक करना क्लास के भीतर ओपनजीएल ग्लूट डिस्प्लेफ़ंक का उपयोग करना क्या मुझे विंडोज़ में संकलन करने के लिए यूनिक्स के pthread.h मिल सकता है? वर्ड वर्ड बाय जावा में रिवर्स @ यूआरएल के माध्यम से नामांकित बीन सीडीआई पर पैरामीटर पास करने के लिए @ किसी विशिष्ट स्ट्रिंग के लिए सभी Git और Mercurial के माध्यम से खोज कैसे करें? सेलेनियम में विस्तार स्थापित करते समय कब पॉपअप को स्वीकार किया जाए? एंड्रॉइड: प्रत्येक देश के साथ एक अलग कार्रवाई करने के लिए एक क्लिक करने योग्य नक्शा छवि कैसे बना सकती है?

Android से जावास्क्रिप्ट को कैसे कॉल करें?

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

Solutions Collecting From Web of "Android से जावास्क्रिप्ट को कैसे कॉल करें?"

एक हैक है:

  1. कुछ जावा ऑब्जेक्ट को बाइंड करें ताकि इसे जावास्क्रिप्ट से वेबव्यू के साथ बुलाया जा सके:

    addJavascriptInterface(javaObjectCallback, "JavaCallback") 
  2. किसी मौजूदा पृष्ठ के भीतर जावास्क्रिप्ट को निष्पादित करें

     WebView.loadUrl("javascript: var result = window.YourJSLibrary.callSomeFunction(); window.JavaCallback.returnResult(result)"); 

(इस मामले में आपका जावा क्लास जावा JavaObjectCallback में एक विधि returnResult(..) होना चाहिए

नोट: यह एक सुरक्षा जोखिम है – इस वेब पेज में कोई भी जेएस कोड आपके बाँध किए गए जावा ऑब्जेक्ट तक पहुंच / कॉल कर सकता है। सर्वश्रेष्ठ कुछ एक-बार कुकीज़ को loadUrl () को पास करने के लिए और अपने जावा ऑब्जेक्ट को वापस पास करने के लिए यह जांचने के लिए कि यह आपका कोड कॉल कर रहा है।

वेबओव्यू के बिना जावा स्क्रिप्ट को चलाने के लिए Rhino पुस्तकालय का उपयोग कर सकते हैं।

राइनो को पहली बार डाउनलोड करें , इसे खोलें, लिब्स फ़ोल्डर के अंतर्गत js.jar फ़ाइल डालें। यह बहुत छोटा है, इसलिए आपको चिंता करने की ज़रूरत नहीं है कि आपके एपीके फाइल इस एक बाहरी जार की वजह से हास्यास्पद रूप से बड़ी होगी।

यहां जावास्क्रिप्ट कोड निष्पादित करने के लिए कुछ सरल कोड है।

 Object[] params = new Object[] { "javaScriptParam" }; // Every Rhino VM begins with the enter() // This Context is not Android's Context Context rhino = Context.enter(); // Turn off optimization to make Rhino Android compatible rhino.setOptimizationLevel(-1); try { Scriptable scope = rhino.initStandardObjects(); // Note the forth argument is 1, which means the JavaScript source has // been compressed to only one line using something like YUI rhino.evaluateString(scope, javaScriptCode, "JavaScript", 1, null); // Get the functionName defined in JavaScriptCode Object obj = scope.get(functionNameInJavaScriptCode, scope); if (obj instanceof Function) { Function jsFunction = (Function) obj; // Call the function with params Object jsResult = jsFunction.call(rhino, scope, scope, params); // Parse the jsResult object to a String String result = Context.toString(jsResult); } } finally { Context.exit(); } 

आप अपने पद पर अधिक जानकारी देख सकते हैं।

IOS WebviewJavascriptBridge ( https://github.com/marcuswestin/WebViewJavascriptBridge ) की विधि कॉल से मेल करने के लिए, मैंने register_handle और call_handle कॉल के लिए कुछ प्रॉक्सी call_handle । कृपया ध्यान दें मैं एक जावास्क्रिप्ट-गुरु नहीं हूं इसलिए शायद एक बेहतर समाधान हो।

  javascriptBridge = (function() { var handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, param) { if(param !== null && param !== undefined) { JSInterface[name](param); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); 

इस तरह आप जावास्क्रिप्ट से जावा कॉल के लिए भेज सकते हैं, जिसमें स्ट्रिंग पैरामीटर हो सकता है

 javascriptBridge.callHandler("login", JSON.stringify(jsonObj)); 

नीचे कॉल करता है

 @JavascriptInterface public void login(String credentialsJSON) { Log.d(getClass().getName(), "Login: " + credentialsJSON); new Thread(new Runnable() { public void run() { Gson gson = new Gson(); LoginObject credentials = gson.fromJson(credentialsJSON, LoginObject.class); SingletonBus.INSTANCE.getBus().post(new Events.Login.LoginEvent(credentials)); } }).start(); } 

और आप फिर से जावास्क्रिप्ट पर कॉल कर सकते हैं

 javascriptBridge.registerHandler('successfullAuthentication', function () { alert('hello'); }) 

तथा

 private Handler webViewHandler = new Handler(Looper.myLooper()); webViewHandler.post( new Runnable() { public void run() { webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();" } } ); 

यदि आपको एक पैरामीटर पास करना है, तो JSON स्ट्रिंग के लिए सीरियलाइज़ करें, तो StringEscapeUtils.escapeEcmaScript(json) कॉल करें, अन्यथा आप unexpected identifier: source (1) प्राप्त करें unexpected identifier: source (1) त्रुटि

थोड़ा चिपचिपा और हैमी, लेकिन यह काम करता है। आपको बस निम्नलिखित को निकालना होगा

 connectWebViewJavascriptBridge(function(bridge) { } 

संपादित करें:

वैश्विक चर को वास्तविक संपत्ति में परिवर्तित करने के लिए, मैं उपरोक्त कोड को निम्न में बदल दिया है:

 (function(root) { root.bridge = (function() { var handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, param) { if(param !== null && param !== undefined) { Android[name](param); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); 

मुझे जावास्क्रिप्ट वैश्विक मॉड्यूल या वैश्विक चर से विचार मिला है।

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

एंड्रॉइड से कॉलिंग कार्य बहुत आसान है:

 JSContext context = new JSContext(); String script = "function factorial(x) { var f = 1; for(; x > 1; x--) f *= x; return f; }\n" + "var fact_a = factorial(a);\n"; context.evaluateScript("var a = 10;"); context.evaluateScript(script); JSValue fact_a = context.property("fact_a"); System.out.println(df.format(fact_a.toNumber())); // 3628800.0 

संस्करण 2.0 के पास बहुत छोटा पदचिह्न है