दिलचस्प पोस्ट
अजगर वर्ग जो ** अनपैकिंग के लिए मैपिंग के रूप में कार्य करता है एंड्रॉइड रनऑनयूआईथ्रेड स्पष्टीकरण पूर्ण यूआरएल का उपयोग करते समय PHP file_get_contents बहुत धीमा है क्या सीएसएस में एक आईएमजी टैग की एक सीआरटी विशेषता के बराबर सेट करना संभव है? गुप्त कुंजी सेट नहीं किया गया था पायथन MySQLdb प्रकार त्रुटि: स्ट्रिंग फ़ॉर्मेटिंग के दौरान सभी तर्क परिवर्तित नहीं किए गए स्विफ्ट में रीचॅबिलिटी, एनएस एनोटिफिकेशन और नेटवर्क लिंक कंडीशनर का उपयोग करके नेटवर्क कनेक्टिविटी परिवर्तन का पता लगाया जा रहा है एंड्रॉइड में एक गतिविधि में सॉफ्टकेबोर्ड खुला और करीबी श्रोता? सी में मेमोरी में फ्लोट संख्या का प्रतिनिधित्व कैसे करें "फ़ाइल को शामिल नहीं किया जा सकता है: 'config-win.h': ऐसा कोई फ़ाइल या निर्देशिका" mysql-python स्थापित नहीं करते समय प्रारंभिक रूप में नए घोषित वैरिएबल (int x = x + 1) का उपयोग करना? AJAX पोस्ट अनुरोध के लिए Laravel सीएसआरएफ टोकन बेमेल यह जांचने का सर्वोत्तम तरीका है कि क्या यूआईटीबल वीक्सेल पूरी तरह से दृश्यमान है NSDefaultRunLoopMode बनाम NSRunLoopCommonModes जावा का उपयोग करके सेलेनियम वेबड्राइवर में माउसओवर फ़ंक्शन कैसे करें?

WPF WebBrowser नियंत्रण – स्क्रिप्ट त्रुटियों को दबाने के लिए कैसे?

मुझे यहां एक समान सवाल मिला:

WPF WebBrowser नियंत्रण का उपयोग करते समय मैं स्क्रिप्ट त्रुटियों को कैसे रोकूं?

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

मेरे वेबकंट्रोल पर SuppressScriptErrors एक उपलब्ध विशेषता नहीं दिखता है 🙁

वेब के समाधान से एकत्रित समाधान "WPF WebBrowser नियंत्रण – स्क्रिप्ट त्रुटियों को दबाने के लिए कैसे?"

यहां एक सी # रूटीन है जो कि WPF के WebBrowser को चुप मोड में डालने में सक्षम है। आप इसे वेबब्राउज़र आरंभीकरण पर कॉल नहीं कर सकते क्योंकि यह बहुत जल्दी है, लेकिन नेविगेशन के बजाय यहां एक डब्लूपीएम नमूना एप्लिकेशन है जिसमें एक वाईबैन वेबब्राउसर घटक है:

 public partial class Window1 : Window { public Window1() { InitializeComponent(); wbMain.Navigated += new NavigatedEventHandler(wbMain_Navigated); } void wbMain_Navigated(object sender, NavigationEventArgs e) { SetSilent(wbMain, true); // make it silent } private void button1_Click(object sender, RoutedEventArgs e) { wbMain.Navigate(new Uri("... some url...")); } } public static void SetSilent(WebBrowser browser, bool silent) { if (browser == null) throw new ArgumentNullException("browser"); // get an IWebBrowser2 from the document IOleServiceProvider sp = browser.Document as IOleServiceProvider; if (sp != null) { Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E"); object webBrowser; sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser); if (webBrowser != null) { webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent }); } } } [ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] private interface IOleServiceProvider { [PreserveSig] int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject); } 

सोचा कि यह यहां जोड़ने के लिए प्रासंगिक होगा। WPF WebBrowser के अंतर्निहित WebBorwser ActiveX नियंत्रण और इसके अन्यथा अनुपलब्ध विधियों और घटनाओं को प्राप्त करने का एक और विकल्प है। मैं सिर्फ कुछ दिनों पहले इसे खोज चुका हूं। यह बहुत आसान है और इसे WB पर आरंभिक नेविगेशन की आवश्यकता नहीं है:

 dynamic activeX = this.WB.GetType().InvokeMember("ActiveXInstance", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, this.WB, new object[] { }); activeX.Silent = true; 

बेशक, वहाँ एक मौका है कि यह विधि फ्रेमवर्क के भविष्य के संस्करण में काम नहीं कर सकती है, लेकिन ऐसा किसी भी अन्य undocumented विधि के बारे में सच है। अब तक, यह नेट। नेट 3.0 के बाद से है। यहाँ एक कार्यशील कोड नमूने के साथ अधिक विवरण।

इस समस्या को हल करने के लिए शानदार तरीके से साइमन मोरीयर के लिए धन्यवाद मैंने थोड़ा सुधार किया और सम्मिलित संपत्ति में साइमन का समाधान किया।

अपने आवेदन में मैं वेबब्राउजर कंट्रोल डाटाबेस को व्यू-मॉडेल के लिए उपयोग करता हूं, वेबब्रोवर को निष्क्रिय टैबआईटीम पर छिपाया जा सकता है, इसलिए मुझे यह जांचना होगा कि जावास्क्रिप्ट त्रुटियों को चुप करने से पहले यह लोड और नेविगेट किया गया है। और इस सेटिंग को सिर्फ एक बार किया जाना चाहिए, इसलिए सेट करने के बाद मैं हुक घटनाओं को छोड़ देता हूं

एक्सएएमएल कोड:

 <TabControl xmlns:b="clr-namespace:MyApplication.Behaviors"> <TabItem Header="foo">...</TabItem> <TabItem Header="Google map"> <WebBrowser b:BindableSource="{Binding Path=MapUrl}" b:DisableJavascriptErrors="True" /> </TabItem> </TabControl> 

व्यवहार कोड:

 using System; using System.Reflection; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; namespace MyApplication.Behaviors { public class WebBrowserBehavior { private static readonly Type OwnerType = typeof (WebBrowserBehavior); #region BindableSource public static readonly DependencyProperty BindableSourceProperty = DependencyProperty.RegisterAttached( "BindableSource", typeof(string), OwnerType, new UIPropertyMetadata(OnBindableSourcePropertyChanged)); [AttachedPropertyBrowsableForType(typeof(WebBrowser))] public static string GetBindableSource(DependencyObject obj) { return (string)obj.GetValue(BindableSourceProperty); } [AttachedPropertyBrowsableForType(typeof(WebBrowser))] public static void SetBindableSource(DependencyObject obj, string value) { obj.SetValue(BindableSourceProperty, value); } public static void OnBindableSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var browser = d as WebBrowser; if (browser == null) return; browser.Source = (e.NewValue != null) ? new Uri(e.NewValue.ToString()) : null; } #endregion #region DisableJavascriptErrors #region SilentJavascriptErrorsContext (private DP) private static readonly DependencyPropertyKey SilentJavascriptErrorsContextKey = DependencyProperty.RegisterAttachedReadOnly( "SilentJavascriptErrorsContext", typeof (SilentJavascriptErrorsContext), OwnerType, new FrameworkPropertyMetadata(null)); private static void SetSilentJavascriptErrorsContext(DependencyObject depObj, SilentJavascriptErrorsContext value) { depObj.SetValue(SilentJavascriptErrorsContextKey, value); } private static SilentJavascriptErrorsContext GetSilentJavascriptErrorsContext(DependencyObject depObj) { return (SilentJavascriptErrorsContext) depObj.GetValue(SilentJavascriptErrorsContextKey.DependencyProperty); } #endregion public static readonly DependencyProperty DisableJavascriptErrorsProperty = DependencyProperty.RegisterAttached( "DisableJavascriptErrors", typeof (bool), OwnerType, new FrameworkPropertyMetadata(OnDisableJavascriptErrorsChangedCallback)); [AttachedPropertyBrowsableForType(typeof(WebBrowser))] public static void SetDisableJavascriptErrors(DependencyObject depObj, bool value) { depObj.SetValue(DisableJavascriptErrorsProperty, value); } [AttachedPropertyBrowsableForType(typeof(WebBrowser))] public static bool GetDisableJavascriptErrors(DependencyObject depObj) { return (bool)depObj.GetValue(DisableJavascriptErrorsProperty); } private static void OnDisableJavascriptErrorsChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var webBrowser = d as WebBrowser; if (webBrowser == null) return; if (Equals(e.OldValue, e.NewValue)) return; var context = GetSilentJavascriptErrorsContext(webBrowser); if (context != null) { context.Dispose(); } if (e.NewValue != null) { context = new SilentJavascriptErrorsContext(webBrowser); SetSilentJavascriptErrorsContext(webBrowser, context); } else { SetSilentJavascriptErrorsContext(webBrowser, null); } } private class SilentJavascriptErrorsContext : IDisposable { private bool? _silent; private readonly WebBrowser _webBrowser; public SilentJavascriptErrorsContext(WebBrowser webBrowser) { _silent = new bool?(); _webBrowser = webBrowser; _webBrowser.Loaded += OnWebBrowserLoaded; _webBrowser.Navigated += OnWebBrowserNavigated; } private void OnWebBrowserLoaded(object sender, RoutedEventArgs e) { if (!_silent.HasValue) return; SetSilent(); } private void OnWebBrowserNavigated(object sender, NavigationEventArgs e) { var webBrowser = (WebBrowser)sender; if (!_silent.HasValue) { _silent = GetDisableJavascriptErrors(webBrowser); } if (!webBrowser.IsLoaded) return; SetSilent(); } /// <summary> /// Solution by Simon Mourier on StackOverflow /// http://stackoverflow.com/a/6198700/741414 /// </summary> private void SetSilent() { _webBrowser.Loaded -= OnWebBrowserLoaded; _webBrowser.Navigated -= OnWebBrowserNavigated; // get an IWebBrowser2 from the document var sp = _webBrowser.Document as IOleServiceProvider; if (sp != null) { var IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); var IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E"); object webBrowser2; sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser2); if (webBrowser2 != null) { webBrowser2.GetType().InvokeMember( "Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser2, new object[] { _silent }); } } } [ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] private interface IOleServiceProvider { [PreserveSig] int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject); } public void Dispose() { if (_webBrowser != null) { _webBrowser.Loaded -= OnWebBrowserLoaded; _webBrowser.Navigated -= OnWebBrowserNavigated; } } } #endregion } } 

@ सिमोन मूरियर ने मेरे लिए काम नहीं किया, लेकिन यह किया:

 public void HideScriptErrors(WebBrowser wb, bool Hide) { FieldInfo fiComWebBrowser = typeof(WebBrowser) .GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); if (fiComWebBrowser == null) return; object objComWebBrowser = fiComWebBrowser.GetValue(wb); if (objComWebBrowser == null) return; objComWebBrowser.GetType().InvokeMember( "Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide }); } 

ध्यान दें कि मुझे इसे यहाँ से मिला है

मुझे भी जावास्क्रिप्ट त्रुटियों को निष्क्रिय करने का एक दिलचस्प तरीका मिला है। लेकिन आपको सुरुचिपूर्ण गतिशील प्रकार का उपयोग करने के कारण कम से कम नेट फ्रेमवर्क 4.0 का उपयोग करना होगा।

आपको वेबब्राइसर तत्व की LoadCompleted इवेंट की सदस्यता लेने की आवश्यकता है:

 <WebBrowser x:Name="Browser" LoadCompleted="Browser_OnLoadCompleted" /> 

इसके बाद आपको एक इवेंट हैंन्डलर लिखना होगा जो नीचे दिखता है:

  void Browser_OnLoadCompleted(object sender, NavigationEventArgs e) { var browser = sender as WebBrowser; if (browser == null || browser.Document == null) return; dynamic document = browser.Document; if (document.readyState != "complete") return; dynamic script = document.createElement("script"); script.type = @"text/javascript"; script.text = @"window.onerror = function(msg,url,line){return true;}"; document.head.appendChild(script); } 

आप अपने समाधान को देख सकते हैं: Silverlight में WebBrowser नियंत्रण में जावास्क्रिप्ट त्रुटियों को अक्षम करना – यह सिल्वरलाइट के लिए है लेकिन इसे WPF के लिए भी काम करना चाहिए।

ठीक है अगर यह आवश्यक था मैं WinformHost लिए चला गया होता और WebBrowser नियंत्रण को इसमें जोड़ा और इसका इस्तेमाल किया

आप यहां उन कार्यों को आसानी से WinformHost भी कर सकते हैं क्योंकि मैंने पूरी तरह से आवेदन किए हैं जो चीजों की बंडल करता है

प्रतिबिंब का उपयोग किए बिना यह कैसे करना है इसका उदाहरण यहां दिया गया है

  /// <summary> /// Gets an interop web browser. /// </summary> /// <param name="browser"></param> /// <returns></returns> public static SHDocVw.WebBrowser GetInteropWebBrowser(this WebBrowser browser) { Guid serviceGuid = new Guid("0002DF05-0000-0000-C000-000000000046"); Guid iid = typeof(SHDocVw.IWebBrowser2).GUID; Interop.IServiceProvider serviceProvider = (Interop.IServiceProvider)browser.Document; SHDocVw.IWebBrowser2 browser2 = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid); SHDocVw.WebBrowser wb = (SHDocVw.WebBrowser)browser2; return wb; } /// <summary> /// Disables script errors for the browser. /// </summary> /// <param name="browser"></param> /// <param name="silent"></param> public static void SetSilent(this WebBrowser browser, bool silent) { SHDocVw.WebBrowser browser2 = browser.GetInteropWebBrowser(); if (browser2 != null) browser2.Silent = silent; } /// <summary> /// Provides the COM interface for the IServiceProvider. /// </summary> [ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IServiceProvider { /// <summary> /// Queries the service. /// </summary> /// <param name="serviceGuid"></param> /// <param name="riid"></param> /// <returns></returns> [return: MarshalAs(UnmanagedType.IUnknown)] object QueryService(ref Guid serviceGuid, ref Guid riid); } 

उसके बाद ब्राउज़र नियंत्रक को होस्ट करने वाले दृश्य के लिए निर्माता में:

  Browser.Navigated += (s, e) => { Browser.SetSilent(true); }; 

वाकई बहुत आसान है, आपके समाधान के लिए धन्यवाद।

http://social.msdn.microsoft.com/Forums/en-US/6996b0c5-b44d-4040-9dbe-6206b1d9185e/webbrowser-script-error-when-using-google-maps?forum=wpf&prof=required


 Dim sb As New StringBuilder sb.Append("<html>") sb.Append("<head>") sb.Append("</head") sb.Append("<body>") sb.Append("<iframe src ='" + url + "' height='" + webBrowser1.Height + "' width='" + webBrowser1.Width + "'></iframe>") sb.Append("</body") sb.Append("</html>") WebBrowser1.DocumentText = sb.ToString