我正在尝试填充网页(在delphi xe5中的twebbrowser中打开)。它有两个组合框。 借调是基于第一个。因此,只有在填写第一个组合框时,才会填充第二个组合框中的选项。
我的问题是在第一个ComboBox中我能够选择正确的值,但是当我尝试选择第二个时,它没有被选中,它保持默认值。 < / p>
这是第一个组合框的HTML
<span class="body-textm-blue-bold" style="margin-top:5px;">
<SELECT ID='lstComp' NAME='COMP' VALUE='1' old_value='1' CLASS='' STYLE='' onChange=' ChangeOldValue(this);' onClick='' onBlur='' onFocus='' onKeyPress='checkEnter(event)' >
<OPTION VALUE='1' ADD1='' SELECTED>1 - Company 1</OPTION>
<OPTION VALUE='2' ADD1=''>2 - Company 2</OPTION>
<OPTION VALUE='6' ADD1=''>6 - Company 6</OPTION></SELECT>
</span>
,第二个是类似的,但根据我在这里选择的内容进行了更改。
onChange函数基本上调用doAJAXCallClientSelection。
这是doAJAXCallClientSelection:
function doAJAXCallClientSelection() {
poststr = "COMP=" + escape( document.getElementById("lstComp").value ) +
"&TITL=" + escape( document.getElementById("lstTitle").value );
poststr = poststr +
"&ST=" + escape( document.getElementById("lstState").value ) +
"&PR=" + escape( document.getElementById("lstProductType").value ) +
"&AG=" + escape( document.getElementById("txtTitle").value ) +
"&PT=" + escape( document.getElementById("lstTypeOfTerm").value ) +
"&DT=" + escape( document.getElementById("txtEffectiveDate").value ) +
"&Page From=" + escape( document.getElementById("pageFrom").value);
var xmlhttp = null;
if (window.XMLHttpRequest) {
xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST", 'refreshCompanyTitleSel', true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", poststr.length);
xmlhttp.setRequestHeader("Connection", "close");
}
xmlhttp.send(poststr);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4) {
if(xmlhttp.status==200) {
var res = xmlhttp.responseText;
fld = eval(document.getElementById('search'));
if (fld) {
res = res.replace("VALUE='*' old_value='*'","VALUE='1' old_value='1'");
res = res.replace("<OPTION VALUE='x' ADD1='' SELECTED>All Companies </OPTION>"," ");
res = res.replace("<OPTION VALUE='x' ADD1=''>All Companies </OPTION>"," ");
res = res.replace("<OPTION VALUE='xxx' ADD1=''>All Titles </OPTION>"," ");
res = res.replace("<OPTION VALUE='xxx' ADD1='' SELECTED>All Title </OPTION>"," ");
fld.innerHTML="";
fld.innerHTML=trim(res);
}
}
}
}
}
我发现它有一个帖子(
xmlhttp.open(&#34; POST&#34;,&#39; refreshCompanyTitleSel&#39;,true);
)但是我的onDocumentComplete没有被调用。
这会导致我的问题吗?
这是我的onDocumentchange:
if URL = 'https://www.xxx.xx/xxxxxxxxInquiry' then
begin
doc := getFrame(WebBrowser1);
if not Assigned(Doc) then
Exit;
FireEvent(doc,'lstComp','onchange','2');
FireEvent(doc,'lstTitle','onchange','25');
End;
这是FireEvent程序:
procedure TForm1.FireEvent(doc: IHTMLDocument2;ID,event, value: String);
var
v: OleVariant;
doc3: IHTMLDocument3;
el: IHTMLElement;
begin
if doc.QueryInterface(IHTMLDocument3, doc3) = S_OK then
begin
el := doc3.getElementById(ID);
if el <> nil then
begin
(el as IHTMLSelectElement).value := value;
(el as IHTMLElement3).FireEvent(event, v);
end;
end;
end;
我从这个网站得到的。它工作正常,它在组合框1中设置正确的值
当我触发第二个组合框时:
FireEvent(doc,'lstTitle','onchange','25');
它不会使用正确的值更新第二个组合框,它只保留默认值。
在WebBrowser1DocumentComplete中调用fire事件。
我尝试只填充第一个组合框,然后使用按钮加载第二个组合框,这样就可以了,它在组合框2中设置了正确的值。
似乎我在第一个加载第二个组合框之前调用第二个火灾事件。反正有没有等待它填充? 我检查过它并没有再次调用WebBrowser1DocumentComplete。
我也尝试添加
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
第一次通话后,但没有变化。