Как вызвать два java-скрипта в onchange одновременно? - PullRequest
0 голосов
/ 21 февраля 2012

Я вызываю два сценария Java в onChange, которые называются двумя различными действиями стоек.

Код следующий:

<html:select property="countryid" onchange="retrieveURL('showStates.do?country=' + this.value);retrieveURL2('showStatesNotinGroup.do?country=' + this.value);">



     function retrieveURL(url)
   {
    if(window.XMLHttpRequest)
    {
        // Non-IE browsers
        req = new XMLHttpRequest();       
        req.onreadystatechange = processStateChange;
        try {
             req.open("GET", url, true);
        } catch (e) {
             alert(e);
        }
        req.send(null);
    } else if (window.ActiveXObject) { // IE

         req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
             req.onreadystatechange = processStateChange;
             req.open("GET", url, true);
             req.send();
         }
    }

   }
   function processStateChange() {
        if (req.readyState == 4) { // Complete
        if (req.status == 200) { // OK response

                document.getElementById("box2View").innerHTML = req.responseText;
            } else {
             alert("Problem: " + req.statusText);
            }
        }
    }

function retrieveURL2(url)
    {
        if (window.XMLHttpRequest) {
            // Non_IE broeser
            req = new XMLHttpRequest();
            req.onreadystatechange = processCityChange;
            try {
                req.open("GET", url, true);
            } catch (e) {
                alert(e);
            }
            req.send(null);         
        }  else if (window.ActiveXObject) {
            //IE
            req = new ActiveXObject("Microsoft.XMLHTTP");
            if (req) {
                req.onreadystatechange = processCityChange;
                req.open("GET", url, true);
                req.send();
            }
        }       
   }

   function processCityChange(){
    if (req.readyState == 4) { //Coplete
        if (req.status == 200) { // OK responce
            document.getElementById("box1View").innerHTML = req.responseText;
        }else {
            alert("Problem: " + req.statusText);
        }
    }   
   }

Для этого действия отображается:

<action path="/showStates" type="com.dss.action.ShowStatesAction" validate="false" name="stateForm">
            <forward name="success" path="/showStates.jsp"/>
        </action>       
        <action path="/showStatesNotinGroup" type="com.dss.action.ShowStatesAction" validate="false" name="stateForm">
            <forward name="success" path="/showStatesNotInGroup.jsp"/>
        </action>       
    </action-mappings>

Когда я запускаю его один за другим для проверки, он работает нормально, но когда я звонювместе это дает мне неожиданный результат.

Я хочу вызвать первый java-скрипт и проверить его успешность, а затем вызвать второй на том же onChange.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Вам необходимо объявить свою переменную req в каждой функции, в противном случае обе функции используют одну и ту же глобальную переменную. Вы можете также рассмотреть возможность использования такой инфраструктуры, как jQuery, поскольку у вас будет хорошо протестированный, независимый от браузера код с меньшими усилиями с вашей стороны.

function retrieveURL(url)
{
    var req; // <-- declare local so the scopes don't conflict
    if(window.XMLHttpRequest)
    {
    ...
}

function retrieveURL2(url)
{
    var req; // <-- declare local so the scopes don't conflict
    if(window.XMLHttpRequest)
    {
    ...
}

И с JQuery

<script type="text/javascript" src=...jquery_location, local or via Google CDN
<script type="text/javascript">
     $(function() {
         $('#countryid').on('change', function() { // single handler for both
              var $this = $(this), // cache jQuery object for later use
                  val = $this.val(); // cache value
              $.get('showStates.do?country=' + val, function(result) {
                    $('#box2View').html(result);
              });
              $.get('showStatesNotinGroup.do?country=' + val, function(result) {
                    $('#box1View').html(result);
              });
          });
      });
</script>
0 голосов
/ 27 февраля 2012

я нашел способ сделать это и он отлично работает, поэтому я делюсь с вами своим путем

<html:select property="countryid" onchange="retrieveURL(this.value);">

и скрипт java похож на

function retrieveURL(url){

var newUrl = 'showStates.do?country='+url; 

// do some thing


retrieveURL2(url);

}

function retrieveURL2(url){

var newUrl2 = 'showStatesNotinGroup.do?country='+url; 
// do same thing

}
...