2011-07-29 16 views
11

मैं जावास्क्रिप्ट चर के मान को पढ़ने की कोशिश कर रहा हूं जिसे लोड किया गया है और मेरे फॉर्म पर वेबब्रोसर नियंत्रण से बुलाया गया है।वेब ब्राउज़र नियंत्रण से जावास्क्रिप्ट चर पढ़ें

उदाहरण:

index.html, एक जावास्क्रिप्ट 'test.js' test.js पर कहा जाता है को संदर्भित करता है कई चर बनाया है और आबादी वाले कर रहे हैं।

index.html फिर इस जेएस को कॉल करता है।

Index.html लोड किया गया है और WebBrowser नियंत्रण में प्रदर्शित किया गया है।

मुझे वेब ब्राउजर नियंत्रण में रहने वाले कार्यों को कॉल/इनवॉक करने के तरीके पर बहुत मदद मिली है। मैं एक परिवर्तनीय मूल्य को आसानी से कैसे पढ़ सकता हूं?

उत्तर

-4

मुझे लगता है कि यह वास्तव में एक scoping सवाल है। आप एक फ़ाइल बुलाया test.js शामिल हैं और उस फ़ाइल में आप इस लाइन में हैं:

var myVariable; 

तब उस चर वैश्विक गुंजाइश के साथ बनाया है और अपने पृष्ठ में कहीं भी और किसी भी अन्य JavaScript फ़ाइलों में से पहुँचा जा सकता है है कि आप शामिल। यदि आप उस तरह के एक चर के बारे में बताते हैं, तो फ़ंक्शन के बाहर, यह वैश्विक दायरे के साथ बनाया जाएगा।

एक विचार। यदि आप अपने मुख्य पृष्ठ में अपने चर का उपयोग करने में सक्षम नहीं हैं, तो सुनिश्चित करें कि आपकी स्क्रिप्ट जो इसे घोषित करती है और मान निर्दिष्ट करती है, आपके पृष्ठ पर जावास्क्रिप्ट का उपयोग करने से पहले इसका उपयोग करने का प्रयास किया जाता है। आपके पास निष्पादन समस्या का आदेश हो सकता है।

+0

तो मेरे वेब ब्राउजर नियंत्रण ने वेबपृष्ठ को लोड करने के बाद अपने सी # एप्लिकेशन के अंदर से अपने वैरिएबल को कैसे एक्सेस कर सकता हूं? – AllStar11

+0

यदि यह सवाल है कि आप पूछ रहे हैं कि आप वापस जा सकते हैं और अपना मूल प्रश्न संपादित कर सकते हैं। यह बहुत स्पष्ट नहीं है। –

1

मुझे नहीं लगता कि आप अपने जेएस से अपने चर के मूल्य को प्राप्त करने में सक्षम होने जा रहे हैं क्योंकि आपका सी # आपके जेएस var से पहले भी चल रहा है। मेरे पास जेएस वैरिएबल के मूल्य प्राप्त करने के साथ ही यही समस्या है और मैं इसे सीधे करने में सक्षम नहीं हूं। मूल्यों को प्राप्त करने के लिए आप क्या कर सकते हैं HtmlTextWriter विधि का उपयोग करें। यह आपको एक सी # रेंडर जेएस कॉल का उपयोग करने की अनुमति देगा जो आपको अपने चर वैल्यू तक पहुंच देगा।

उदाहरण के लिए:

protected override void RenderContents(HtmlTextWriter writer) 
    { 
     EnsureChildControls(); 
     base.RenderContents(writer); 

writer.BeginRender(); 
     writer.RenderBeginTag(HtmlTextWriterTag.Script); 
     writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); 

     writer.Write("myJavaScriptVar = (\" + myC#Var + \")"); 
writer.RenderEndTag(); 

नहीं 100% यह काम करेंगे, लेकिन मुझे पता है कि आप अपने js चर इस तरह से उपयोग कर सकते हैं। मैंने इसे अन्य परियोजनाओं के साथ किया है। उम्मीद है की यह मदद करेगा।

0

HtmlWindow Class पर एक नज़र डालें। आप इसका उदाहरण WebBrowser.Document.Window से प्राप्त कर सकते हैं। यदि आपके जेएस चर के पास वैश्विक दायरा है, तो वे विंडो ऑब्जेक्ट से संबंधित होंगे, और सी # में WebBrowser.Document.Window.DomWindow से पहुंच योग्य होना चाहिए।

+1

मैंने ऐसा करने के बाद चर का उपयोग कैसे किया? – AllStar11

2

आप स्क्रिप्ट इंजन के ऑटोमेशन इंटरफ़ेस को पुनर्प्राप्त करने के लिए IHTMLDocument :: स्क्रिप्ट का उपयोग कर सकते हैं। यदि आप सी # में विंडोज फॉर्म वेबब्रोसर नियंत्रण का उपयोग करते हैं, तो इसका मतलब है कि HtmlDocument.DomDocument प्रॉपर्टी mshtml.IHTMLDocument पर कास्टिंग करें। डब्ल्यूपीएफ के लिए आपने सीधे दस्तावेज़ डाला।

वैश्विक चर को स्क्रिप्ट इंजन में गुणों और वैश्विक कार्यों के रूप में जोड़ा जाता है। IE9 तक, यदि आप उनके नाम जानते हैं तो आप उन कार्यों/चरों तक पहुंचने के लिए IDISpatch इंटरफ़ेस का उपयोग कर सकते हैं। HtmlDocument.InvokeScript और WPF का WebBrowser.InvokeScript इसे एक अच्छे तरीके से लपेटता है, लेकिन केवल System.Reflection.BindingFlags.InvokeMethod के लिए। चरों तक पहुंचने के लिए आपको जब आप Invoke कहते हैं, तो DISPATCH_PROPERTYGET को पास करने की आवश्यकता होती है, यानी, प्रबंधित कोड में BindingFlags.GetProperty का उपयोग करें।

मैन्युअल देर से बाध्यकारी मजेदार नहीं है, अगर आप जानना चाहते हैं कि देर से बाध्यकारी कितना श्रमिक है, तो Binding for Office automation servers with Visual C# .NET देखें।

There is a problem in IE9 that the variables/functions are not accessible via IDispatch, लेकिन आप अभी भी IDispatchEx के माध्यम से चर/चर का उपयोग कर सकते हैं।

+0

सहमत हैं, ग्लोबल जेएस वैरिएबल प्राप्त करने/स्थापित करने के लिए InvokeScript सबसे सही तरीका है (जो कि अंतिम रूप में HTMLWindow कस्टम गुण हैं)। मेरी टिप्पणी को किसी अन्य थ्रेड में देखें: http://stackoverflow.com/questions/11242482/c-sharp-get-variable-from-webbrowser-generated-by-javascript#comment18867034_11317873 – RReverser

7

आप कर सकता है:

Document.InvokeScript("eval", new object[] { "my_var_name" }); 
1

वैश्विक क्षेत्र जावास्क्रिप्ट चर, मैं एक कस्टम विधि यहाँ GetGlobalVariable() बुलाया शामिल इस्तेमाल किया उपयोग करने के लिए। (यह Juan's answer से Document.InvokeScript का उपयोग करता +1।)

के इस तरह वैश्विक क्षेत्र में बनाए गए अपने जावास्क्रिप्ट चर मान लीजिए:

var foo = "bar"; 
var person = {}; 
var person.name = "Bob"; 

तो फिर तुम इन मूल्यों को तो जैसे सी # GetGlobalVariable() पद्धति का उपयोग करके उपयोग कर सकते हैं। (आप एक timer स्थापित करने के लिए लगातार जांच करने के लिए करता है, तो चर भर जाती है आवश्यकता हो सकती है।)

var foo = GetGlobalVariable(webBrowser, "foo"); 
var name = GetGlobalVariable(webBrowser, "person.name"); 

यहाँ GetGlobalVariable() तरीका है। ध्यान दें कि अपवाद से बचने के लिए यह चर संदर्भ के प्रत्येक भाग को जांचता है।

private object GetGlobalVariable(WebBrowser browser, string variable) 
{ 
    string[] variablePath = variable.Split('.'); 
    int i = 0; 
    object result = null; 
    string variableName = "window"; 
    while (i < variablePath.Length) 
    { 
     variableName = variableName + "." + variablePath[i]; 
     result = browser.Document.InvokeScript("eval", new object[] { variableName }); 
     if (result == null) 
     { 
      return result; 
     } 
     i++; 
    } 
    return result; 
} 
संबंधित मुद्दे