我正在尝试在使用Knockout JS的网页上填充表单。当我将值插入特定文本框时,它似乎已取值,但是当我提交表单时,它会保留它以前的值。通过一些挖掘,我发现Knockout JS使用数据绑定来更新底层值。当我在输入文本框中插入一个值时,Knockout JS没有被触发,因此不会更新基础值。 This post用于类似的东西,但带有复选框和下拉框而不是文本框。但我无法弄清楚如何使用文本框。
我正在尝试更新的实际网站需要登录,但我认为Knockout JS网站http://knockoutjs.com/examples/helloWorld.html上的此页面足以用于测试目的。
基本上我需要的是,使用VBA,在2个文本框中输入FirstName和LastName(当前它表示'Planet'和'Earth')。您应该看到2个输入值紧跟在“Hello Planet Earth”的下方。手动将其键入文本框可以正常工作。但我无法让它在VBA中运作。
这是'到目前为止我所拥有的......
Sub KnockoutTest()
Dim IE As New InternetExplorer
Dim hDoc As HTMLDocument
IE.Visible = True
'Load webpage and loop until loading is complete.
IE.Navigate "http://knockoutjs.com/examples/helloWorld.html"
Do While (IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE)
DoEvents
Loop
Set hDoc = IE.Document
Set firstName = hDoc.getElementsByClassName("liveExample").Item(0).all.Item(1)
Set lastName = hDoc.getElementsByClassName("liveExample").Item(0).all.Item(3)
firstName.Click
firstName.Value = "Joe"
lastName.Click
lastName.Value = "Bloggs"
'Close ie object
Set IE = Nothing
Application.ScreenUpdating = True
End Sub
任何人都对如何解决淘汰赛事有任何想法?
我正在尝试更新的页面上的文本框中的实际html是....
<input type="text" ondrop="return false;" onpaste="return false;" data-bind="numericValue: Markup, visible: IsCellEditable(), selected: IsCellEditable(), event: { blur: blurZoneMarkup, keypress: function (data, event) { return $parent.isDecimal(data, event, hdnIsDiscount) }, keydown: function (data, event) { $(event.target).data('tabcode', event.which || event.keyCode); { return true; } } }" style="width: 90%; display: none;">
非常感谢任何帮助或建议。我一直试图解决这个问题3天了!
答案 0 :(得分:0)
基本上,您需要处理“ HTMLevents”之类的自动输入并触发它们。您原始代码的更新摘录:
With hDoc
Set evt = hDoc.createEvent("HTMLEvents")
evt.initEvent "change", True, False
firstName.Value = "Joe"
firstName.dispatchEvent evt
End With
测试了此代码,并在您提供的链接网站上正常工作。
我已经使用VBA完成了许多网站自动化工作,最可靠的方法是针对每个要填写的字段创建一个事件,为该字段分配一个值,并分派创建的事件。
有关更多信息,请参阅MSDN https://msdn.microsoft.com/en-us/ie/ff975247(v=vs.94)
上的文档。