我有一個網頁是訪問時,使用下面的聲明瞭一個日期變量:修改JavaScript變量在WebBrowser控件
var date=new Date("03 Oct 2013 16:04:19");
該日期,然後在頁面的頂部顯示。有沒有辦法讓我修改該日期變量? (而不僅僅是可見的HTML源代碼)
我一直在試驗InvokeScript,但是我發現很難理解,如果有人知道並且可以發佈一些與此直接相關的例子,我會非常感激。謝謝。
我有一個網頁是訪問時,使用下面的聲明瞭一個日期變量:修改JavaScript變量在WebBrowser控件
var date=new Date("03 Oct 2013 16:04:19");
該日期,然後在頁面的頂部顯示。有沒有辦法讓我修改該日期變量? (而不僅僅是可見的HTML源代碼)
我一直在試驗InvokeScript,但是我發現很難理解,如果有人知道並且可以發佈一些與此直接相關的例子,我會非常感激。謝謝。
您可以使用JavaScript的eval注入任何JavaScript代碼,它適用於任何IE版本。你需要確保頁面具有至少一個<script>
標籤,不過這很容易:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Call WebBrowser1.Navigate("http://example.com")
End Sub
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
'
' use WebBrowser1.Document.InvokeScript to inject script
'
' make sure the page has at least one script element, so eval works
WebBrowser1.Document.Body.AppendChild(WebBrowser1.Document.CreateElement("script"))
WebBrowser1.Document.InvokeScript("eval", New [Object]() {"(function() { window.newDate=new Date('03 Oct 2013 16:04:19'); })()"})
Dim result As String = WebBrowser1.Document.InvokeScript("eval", New [Object]() {"(function() { return window.newDate.toString(); })()"})
MessageBox.Show(result)
End Sub
End Class
或者,你可以使用VB.NET後期綁定直接調用eval
,而不是Document.InvokeScript
,這可能更容易編碼和閱讀:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Call WebBrowser1.Navigate("http://example.com")
End Sub
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
'
' use VB late binding to call eval directly (seamlessly provided by.NET DLR)
'
Dim htmlDocument = WebBrowser1.Document.DomDocument
Dim htmlWindow = htmlDocument.parentWindow
' make sure the page has at least one script element, so eval works
htmlDocument.body.appendChild(htmlDocument.createElement("script"))
htmlWindow.eval("var anotherDate = new Date('04 Oct 2013 16:04:19').toString()")
MessageBox.Show(htmlWindow.anotherDate)
' the above shows we don't have to use JavaScript anonymous function,
' but it's always a good coding style to do so, to scope the context:
htmlWindow.eval("window.createNewDate = function(){ return new Date().toString(); }")
MessageBox.Show(htmlWindow.eval("window.createNewDate()"))
' we can also mix late binding and InvokeScript
MessageBox.Show(WebBrowser1.Document.InvokeScript("createNewDate"))
End Sub
End Class
+1對'eval'函數的調用很好。如果OP沒有訪問網頁的來源,我也會建議。 –
根據該文件,你需要調用客戶端定義的現有腳本:
的JavaScript:
var extDate = new Date("03 Oct 2013 16:04:19");
function test(date) {
alert(date);
extDate = date;
}
您也可以打電話eval
並運行一個匿名函數。如果您無法控制頁面源,這將是首選的方法。從本質上講,您將在JavaScript解釋器中調用和運行代碼。
C#:
private void InvokeTestMethod(DateTime date)
{
if (webBrowser1.Document != null)
{
webBrowser1.Document.Body.AppendChild(webBrowser1.Document.CreateElement("script"));
webBrowser1.Document.InvokeScript("eval", (Object)"(function() { window.date=new Date('03 Oct 2013 16:04:19'); })()");
webBrowser1.Document.InvokeScript("eval", (Object)"(function() { alert(window.newDate.toString()); })()");
webBrowser1.Document.InvokeScript("eval", (Object)"(function() { window.date=new Date('" + date.ToString("dd MMM yyyy HH:mm:ss") + "'); })()");
webBrowser1.Document.InvokeScript("eval", (Object)"(function() { alert(window.newDate.toString()); })()");
}
}
private void Test()
{
InvokeTestMethod(DateTime.Now);
}
VB.NET
Private Sub InvokeTestMethod([date] As DateTime)
If webBrowser1.Document IsNot Nothing Then
webBrowser1.Document.Body.AppendChild(webBrowser1.Document.CreateElement("script"))
webBrowser1.Document.InvokeScript("eval", new [Object]() {"(function() { window.date=new Date('03 Oct 2013 16:04:19'); })()"}))
webBrowser1.Document.InvokeScript("eval", new [Object]() {"(function() { alert(window.newDate.toString()); })()"}))
webBrowser1.Document.InvokeScript("eval", new [Object]() {"(function() { window.date=new Date('" + [date].ToString("dd MMM yyyy HH:mm:ss") + "'); })()"})
webBrowser1.Document.InvokeScript("eval", new [Object]() {"(function() { alert(window.newDate.toString()); })()"}))
End If
End Sub
Private Sub Test()
InvokeTestMethod(DateTime.Now)
End Sub
http://msdn.microsoft.com/en-us/library/system.windows.forms.htmldocument.invokescript.aspx
通過使用eval,你可以調用anonymous JavaScript函數和網頁的上下文中運行自己的代碼。在最近兩次對eval的調用中,我使用DateTime.Now
設置日期,並以JavaScript可以理解的方式格式化日期。
謝謝Cameron,如果Date定義在函數之外,是否意味着我無法修改它? –
只需從函數外部聲明日期變量,並設置傳遞給函數的參數的日期。我已經更新了我的回答,以說明如何完成此操作。 –
欣賞幫助,也許我沒有足夠好的解釋它..我無法訪問我請求的服務器,因此無法添加設置日期的函數。我想知道是否可以設置在函數之外聲明的日期(或任何其他變量)。因此,我不能使用你提供的InvokeTestMethod()/ InvokeScript,因爲函數中沒有變量聲明來調用 –
你能告訴我們你用'invokeScript()'試過了嗎? – Brad
Dim args As Object()= {「javascript:var date = new Date(」「07 Oct 2013 14:40:43」「);」} WebBrowser1.Document.InvokeScript(「test」,args) –
@johndyas ,你有[一些選項](http://stackoverflow.com/a/19002650/1768303)來做到這一點。 – Noseratio