等待Javascript填充组合框

时间:2014-11-18 22:06:35

标签: javascript delphi twebbrowser

我正在尝试填充网页(在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;
第一次通话后

,但没有变化。

0 个答案:

没有答案