עבודה עם JS דרך C#
-
אני מעוניין למצוא את הדרך הפשוטה והקצרה להריץ קוד JS מתוך אפליקציית WPF בנכתבת בC#.
הפעולות שאני מבקש הם כדלהלן:
- ליצור אובייקט webBrouser
- לטעון לתוכו URL מסויים
- להוסיף אל הדף הטעון כעת קוד JS
- לקרוא ע"י קוד C# לפונקציית JS מסויימת - ולמסור לה ארגומנטים
- לקבל בחזרה פלט מהפונקציה הזו
מה ניסיתי עד עכשיו:
שלב 1 ו2 כמובן ביצעתי.
שלב 3 - הוספת הקוד אל הדף, נתקלתי בבעיה. מצאתי כמה שיטות. ניסיתי להשתמש בהוספת אלמנט "<script>" והוספת קוד אל תוכו באמצעות:var Document2 = (IHTMLDocument2)wbTest.Document; var scriptElement = Document2.createElement("script"); scriptElement.insertAdjacentHTML("afterBegin", "js code");
זה לא הצליח, האלמנט לא נוצר בדף.
ניסיתי להוסיף את האלמנט בצורת מחרוזת HTML בשיטה הבאה:
HTMLDocument document = (HTMLDocument)wbTest.Document; IHTMLElement body = (IHTMLElement)document.body; body.insertAdjacentHTML("afterBegin", "סתם קוד HTML נוסף לבדיקה<script>alert (123) function test (a,b){alert(123)}</script>");
האלמנט וקוד הHTML נוצר, אולם קוד הJS שבתוכו לא הופעל. יש לשים לב ששמתי גם קוד שמופעל אוטומטית וגם קוד בפונקציה שדורש קריאה.
ניסיתי את השיטה הבאה שמפעילה קוד JS באופן ישיר:
var Document2 = (IHTMLDocument2)wbTest.Document; string jsCode = "js code"; Document2.parentWindow.execScript(jsCode);
אלא שבשיטה זו אין לי אפשרות לקרוא לפונקציה מסויימת, לא לשלוח ארגומנטים, ולא לקבל פלט
ניסתי לקרוא לJS בצורה הבאה:
object[] args = { tb1.Text, tb2.Text }; wbTest.InvokeScript("test", args);
בצורה הזו אני יכול לקרוא לפנוקציה ולמסור ארגומנטים, אבל, זה עבד רק אם הטמעתי מראש את קוד הJS בדף אינטרנט שאני יצרתי, מה שלא עוזר לי.
יש לציין, שאם אמצא דרך לבצע את שאר השלבים, לקבל פלט אפשר בצורת שינוי בDOM ואחרי זה לקרוא אותו.
תודה מראש
-
@davidnead מתוך קוד שכתבתי פעם
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script"); IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement; element.text = "function alertHello() {alert('hello');};"; ele.AppendChild(scriptEl); webBrowser1.Document.InvokeScript("alertHello");
ה ele צריך להיות אובייקט בצורה כזו:
HtmlElement ele in webBrowser1.Document.GetElementsByTagName("div")
כשתריץ את הקובץ, הדפדפן יפעיל alert "hello".
-
תודה. יצירת הele משום מה לא הצליחה. בסוף הצלחתי בעקבות הקוד שלך עם הקוד הפשוט הבא:
HtmlElement scriptJQ = wbTest.Document.CreateElement("script"); scriptJQ.InnerText = WindowsFormsApp1.Properties.Resources.JQUERY; wbTest.Document.Body.AppendChild(scriptJQ);
אלא שזה התברר ככושל למטרה שרציתי. מהסיבה הפשוטה שהIE דפוק לגמרי, ולא יכול להריץ אפילו סקריפט אחד נורמלי. גם אחרי ששינתי את ההגדרה כך שיציג את הגרסה האחרונה של הIE.
אז עכשיו אני רוצה להשתמש לאותה מטרה באובייקט הדפדפן של cefSharp. אלא שלמרות שהצלחתי להתקינו כיאות ולעשות שימוש ניסיון באובייקט, איני יוד'ע להשתמש בו כיאות למטרה שביקשתי - למרות שהוא מיועד לה באופן טבעי יותר. לא הצלחתי לעקוב וליישם את ההדרכות עקב חוסר ניסיוני בC#.
-
@davidnead אני בדיוק עובד על זה. אהיה ריתך בקשר.
-
@מנצפך אמר בעבודה עם JS דרך C#:
@davidnead אני בדיוק עובד על זה. אהיה ריתך בקשר.
תודה, מעולה. אני זקוק לקוד ברמה הבסיסית ביותר: הטענת פונקציה, קריאה, וקבלת תגובה. בהדרכה שם התקשתי אפילו להבחין מה קוד C# ומה קוד JS.
המטרה שלי היא פשוט להריץ JS מאפליקציה שולחנית ללא שימוש בדפדפן ה"אמיתי". -
-
@davidnead אמר בעבודה עם JS דרך C#:
System.Exception: 'Browser is not yet initialized. Use the IsBrowserInitializedChanged event and check the IsBrowserInitialized property to determine when the browser has been intialized
זו