Bry*_*ies 8 javascript excel vba javascript-events knockout.js
摘要:
基本上尝试使用Excel VBA编辑网站.编辑似乎有效,但是当我使用保存按钮时,不保存任何内容.我知道保存按钮有效,如下所述.那么为什么我的更新数据不会在屏幕上显示?
故事:
我有这个代码,我已经使用Excel VBA工作了一段时间.它在Internet Explorer中打开一个网页,在我想要的地方导航,填写一大堆数据,所有数据都显示在屏幕上,使用各种方法,例如:
For Each objElement In objElementColl
ExtractedName = objElement.outerHTML
If InStr(ExtractedName, "NewPermit") > 0 Then
objElement.Checked = True
Run Code Online (Sandbox Code Playgroud)
和
Set DropDown = objHTML.getElementById("ProjectFile-AccreditedCertifierId")
DropDown.selectedIndex = 1
Run Code Online (Sandbox Code Playgroud)
要么
objHTML.getElementsByName(ElementName)(0).Value = ValueCheck
Run Code Online (Sandbox Code Playgroud)
所有这些都能很好地工作,并在屏幕上进行更改.然后我使用以下命令单击保存:
Set objElementColl = objHTML.getElementsByClassName("btn")
For Each objElement In objElementColl
ExtractedName = objElement.outerHTML
If InStr(ExtractedName, "click: save, enable:") > 0 Then
objElement.Click
ExtractedName = 1
Exit For
End If
Next
Run Code Online (Sandbox Code Playgroud)
哪个再次正常.问题是它实际上并没有从上面的3个代码中保存我的更改.我试过的是
a)暂停我的代码并手动点击保存(同一问题)
b)暂停我的代码,手动更改复选框并运行代码进行保存(保存手动更改,但不保存编码的代码)
c)暂停代码并手动更改框并手动保存(仅保存手动更改的框)
因此,从上面看,我的保存点击似乎有效,但由于某种原因,尽管使用代码可以明显更改框并填写,但可见和背景之间存在差距.
无论如何,一些HTML源代码.在检查我正在改变的元素时,Chrome会显示什么:
<fieldset>
<legend>Proposal</legend>
<div class="col-xs-12 col-sm-8 col-md-6">
<div class="row">
<div class="col-xs-2 form-group">
<label for="ProjectFile_ProposalLot">Lot</label><input class="form-control" data-bind="textInput: ProjectFile().ProposalLot" maxlength="100" name="ProjectFile-ProposalLot" type="text" />
</div>
<div class="col-xs-2 form-group" data-bind="visible: ProjectFile().StateId() != 7 && ProjectFile().StateId() != 5">
<label data-bind="text: ProjectFile().ProposalDpLabel()"></label>
<input class="form-control" data-bind="textInput: ProjectFile().ProposalDp" maxlength="100" name="ProjectFile-ProposalDp" type="text" />
</div>
Run Code Online (Sandbox Code Playgroud)
我还搜索了页面的整个源代码......我相信这可能很重要,但我不是HTML编码器.我把它缩短了一点
var ProjectFileEditViewModel=(function(){__extends(ProjectFileEditViewModel,ViewModel.Model);function ProjectFileEditViewModel(){ProjectFileEditViewModel.__super__.constructor.apply(this,arguments);};ProjectFileEditViewModel.prototype.fields=function(){return {"Id":new ViewModel.NumberField(0),"StateId":new ViewModel.NumberField(0),"DefaultOfficeAddressId":new ViewModel.ObservableField(),"Name":new ViewModel.ObservableField(),"ExistingApprovalDate":new ViewModel.DateField("DD/MM/YYYY"),"ProjectClosed":new ViewModel.ObservableField(),"ProposalAddress":new ViewModel.ObservableChildField(exports.AddressViewModel,this),"Zoning":new ViewModel.ObservableField(),"ProposalLot":new return ProjectFileEditViewModel;})();if(exports.ProjectFileEditViewModel==null)exports.ProjectFileEditViewModel=ProjectFileEditViewModel;
Run Code Online (Sandbox Code Playgroud)
还有这个......再多一点:
Buildaform.model=new Buildaform.ProjectPageViewModel({ ... ,"ProposalLot":null .... }
Run Code Online (Sandbox Code Playgroud)
我认为这最后一个与它有关,我不知道我是否可以改变它.
对于坏消息,我无法公开发布网站地址或源代码.但请PM我,我可以解决一些问题.
根据您的评论:
- 暂停我的代码,手动更改复选框并运行代码以保存(确实保存手动更改,但不保存编码的更改
问题似乎出在设置表单控件的代码上,而不是单击“保存”按钮的代码上。
这似乎是一个与VBA无关的问题,但与淘汰赛的行为有关- 请参阅此 SO 帖子。相关评论是:
您的问题是 ko 订阅了已检查绑定内的单击事件:
该帖子中的提问者遇到了与您类似的问题 - 他们试图选中一个复选框(以更改视图),但它没有更新视图模型或底层模型本身。Knockout 是一个MVVM框架。
您问题中的泄露是您的手动更改提交,因为您在浏览器中通过点击执行操作时执行了单击并更改,但您的编程方法仅对表单控件进行了更改,但是不是点击第一。
那么,如何通过 IE 通过 VBA 自动化解决这个问题呢?
根据我上面引用的帖子中的解决方案,加上这里的方法,我将冒险使用下面的代码作为可能的解决方案,但请注意它未经测试......
基本上,您需要“单击”要更改的表单元素 - 然后更新控件值。希望“点击”位意味着淘汰视图模型会根据“更改”进行更新,并且从那里,模型数据将被写入数据库(或其他):
您的复选框示例:
If InStr(ExtractedName, "NewPermit") > 0 Then
// hopefully this will get knockout to apply the required binding before your change the value
objElement.Click
objElement.Checked = True
Run Code Online (Sandbox Code Playgroud)
您的下拉示例:
Set DropDown = objHTML.getElementById("ProjectFile-AccreditedCertifierId")
// hopefully this will get knockout to apply the required binding before your change the value
Dropdown.Click
DropDown.selectedIndex = 1
Run Code Online (Sandbox Code Playgroud)
希望有帮助 - 完全是 3 管问题!祝你好运。
归档时间: |
|
查看次数: |
640 次 |
最近记录: |