मैं जावा < -> जावास्क्रिप्ट संचार के लिए नया ब्रांड हूं, क्योंकि मैंने इस सप्ताह इसे एक्सप्लोर करने की योजना बनाई है। यहां एक अच्छा मौका ... :-)
कुछ परीक्षणों के बाद, ऐसा लगता है कि आप जावा एप्लेट में जेएस फ़ंक्शन पास नहीं कर सकते हैं। जब तक मैं इसे गलत तरीके से कर रहा हूँ ...
मैंने कोशिश की:
function CallJava()
{
document.Applet.Call("Does it work?");
document.Applet.Call(function() { alert("It works!"); });
document.Applet.Call(DoSomething); // A simple parameterless JS function
document.Applet.Call(window.location);
}
function DumbTest(message, value)
{
alert("This is a dumb test with a message:\n" + message + "\n" + value);
}
जहां कॉल किया जाता है (कर रहे हैं) के रूप में परिभाषित:
public void Call(String message)
{
JSObject win = (JSObject) JSObject.getWindow(this);
String[] arguments = { "Call with String", message };
win.call("DumbTest", arguments);
}
public void Call(JSObject jso)
{
JSObject win = (JSObject) JSObject.getWindow(this);
String[] arguments = { "Call with JSObject", jso.toString() };
win.call("DumbTest", arguments);
}
जब मैं एक जे एस समारोह पारित (सभी परीक्षणों एफएफ 3 में), मुझे जावा पक्ष पर एक शून्य मिलती है।
ध्यान दें कि निम्न जावा रूटीन DumberTest फ़ंक्शन के जेएस कोड को प्रदर्शित करने की अनुमति देता है!
public int Do()
{
JSObject win = (JSObject) JSObject.getWindow(this);
JSObject doc = (JSObject) win.getMember("document");
JSObject fun = (JSObject) win.getMember("DumberTest");
JSObject loc = (JSObject) doc.getMember("location");
String href = (String) loc.getMember("href");
String[] arguments = { href, fun.toString() };
win.call("DumbTest", arguments);
return fun.toString().length();
}
बिंदु करने के लिए: मैं एक जे एस समारोह बनाया:
function RegisterCallback(cbFunction)
{
var callback = cbFunction.toString(); // We get JS code
var callbackName = /^function (\w+)\(/.exec(callback);
document.Applet.RegisterCallback(callbackName[1]);
}
मैं toString परिणाम से जे एस फ़ंक्शन का नाम निकालने और यह जावा एप्लेट के लिए गुजरती हैं। मुझे नहीं लगता कि हम अनाम कार्यों को संभाल सकते हैं क्योंकि जावा कॉल जेएस नाम से काम करता है।
जावा पक्ष:
String callbackFunction;
public void RegisterCallback(String functionName)
{
callbackFunction = functionName;
}
void UseCallbackFunction()
{
if (callbackFunction == null) return;
JSObject win = (JSObject) JSObject.getWindow(this);
win.call(callbackFunction, null);
}
ऐसा लगता है कि आप केवल नाम से जावा के लिए काम करता है पारित कर सकते हैं, इसलिए आपको बस इतना करना चाहते हैं क्या एक बहाना वस्तु जो एप्लेट लपेटो जाएगा और जो समारोह संदर्भ ले जाएगा बनाने और उनके लिए अस्थायी नाम के साथ आओ। – w00t