הזרקת JS לתוך WebBrowser.Document

הזרקת JS לתוך WebBrowser.Document

חיפשתי דרך לקבל את הDOM של דף Web אחרי ביצוע כל הJS שאמורים להתבצע בדף. הבעיה העיקרית: האירוע DocumentComplete מתרחש מיד שמסתיימת טעינת הדף, אך לפני שמבוצע קוד הJS של הדף. האפשרות שעלתה היא: קודם כל להזריק לדף HTMLElement כלשהו ולקשר אירוע onclick (למשל) שלו לאיזו מתודה בקוד הvb.net שלי. דוגמה:
Dim lblDone As HtmlElement = browser.Document.CreateElement("p") lblDone.Id = "__lblDoNe" lblDone.InnerText = "Done" browser.Document.Body.AppendChild(lblDone) browser.Document.GetElementById("__lblDoNe").AttachEventHandler("onclick", AddressOf js_complete_handler)​
לאחר מכן להזריק קוד JS משלי לסוף הדף (כך שברוב המקרים יתבצע אחרון) שיביים את האירוע המסוים בHTMLElement שהזרקתי. כך תכננתי לקבל את הDOM שאחרי הביצוע.
Dim scriptDone As HtmlElement = browser.Document.CreateElement("script") scriptDone.SetAttribute("type", "text/javascript") scriptDone.InnerText = "document.getElementById(""__lblDoNe"").fireEvent(""onclick"");" browser.Document.Body.AppendChild(scriptDone)​
אך נתקלתי בבעיה שהקוד JS שהזרקתי לא עובד... כל הדוגמאות כאן, מישהו רואה את הבעיה?
 

[eLad]

New member
event עליית מסמך

הזרק לעמוד script עם
onload=function () { alert(document.documentElement.outerHTML); }​
לא משנה היכן, כמובן שאתה צריך לשנות את הקוד שבפונקציה. אירוע onload קורה בעליית העמוד המוחלטת - אחרי שכל ה-html, הקבצים המוכללים, התמונות, הפלאשים וה-iframes סיימו להיטען. אם אתה מסתפק בעליית ה-html אתה יכול להשתמש ב-
// ie document.onreadystatechange=function () { if (document.readyState=="complete") doSomething(); }; // ff document.addEventListener("DOMContentLoaded",doSomething,false);​
 
onload זה עדיין לפני הרצת הJS

וכן readyState==complete מתקיים לפני. אני מצרף כאן קובץ HTML שכתבתי כדי לבדוק את הנושא. אני רוצה שהDOM יכלול גם את האלמנט "javascript_span" שנוסף דינאמית מJS. והבעיה היתה בזה שהקוד השני שכתבתי בהודעה הקודמת לא הביא לביצוע הJS שניסיתי להזריק. בכל אופן תודה על התגובה.
 
אוקיי, קצת טעיתי...

הבעיה שלי הייתה שבקובץ דוגמה שהעלתי קישרתי את הJS לאירוע onload של הדף, כך שכפיתי עליו לרוץ מאוחר יותר (אחרי הonload שהוא רק הטריגר). אך אם הייתי כותב את קוד הJS לא בתוך פונקציה אלא כקוד לביצוע מיידי אז הקוד היה מתבצע לפני הonload ובהתאם גם לפני DocumentCompleted של WebBrowser ולישראל שלום. כך שלפתור את הבעיה כפי שניסחתי אותה בטעות מקודם היא משימה בלתי אפשרית (כמובן יש דרך לגרום להשהיה לפני קריאת הDOM אך זה תריק ולא דרך לוגית, כי היא תלויה בדברים שלא בשליטת היישום) תודה למגיבים. נ.ב. מצורף הקובץ במתכונתו הנוכחית.
 

[eLad]

New member
מכיוון שאתה מבצע כבר משהו ב-onload

אם תשים עוד onload הוא פשוט ידרוס את הנוכחי (זה שקיים ב-body). השתמש ב-attacEvent כדי להריץ מספר אירועי onload מאיזורים שונים בעמוד. attacEvent של onload רץ אחרי onload של העמוד, אבל מספר attacEvent רצים בסדר הפוך מסדר רישומם (בדיוק ההפך מ-mozilla, ולצערינו, מההגיון). attachEvent:
attachEvent("onload",function () {alert("attachEvent");});​
 
באמת תודה!

אתה מאה אחוז צודק. ומודה, אני לא חשבתי על האפשרות. אבל המטרה המרכזית (שלא נפתרה) היא שהקוד vb.net שכתבתי לא משחיל את השורה הרצויה למסמך. אבל אין לי בזה צורך, כי מעולם לא ניסיתי לחכות לביצוע JS שתלוי באירוע (שאם כן, הייתי צריך לחכות או לביים קליקים גרירות ועוד.. ועוד), פשוט לא שמתי לב כשלקחתי קובץ עם JS שכתבתי לפני שנים שהקוד שבו תלוי באירוע ולכן לא הבנתי את התמונה כהלכה. ושוב פעם תודה על התגובה.
 
למעלה