Проблемы с заменой статического идентификатора на переменную - PullRequest
0 голосов
/ 10 августа 2009

У меня есть скрипт, который загружает информацию из внешнего XML-файла и вставляет ее в HTML-страницу по клику. Вот код этого скрипта:

var xmlhttp;
function loadXMLDoc(url,target) {
xmlhttp = null;
if (window.XMLHttpRequest) { // code for all new browsers
    xmlhttp = new XMLHttpRequest();
}
else if (window.ActiveXObject) { // code for IE5 and IE6
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp != null) {
    xmlhttp.onreadystatechange = state_Change;
    xmlhttp.open("GET", url, true);
    xmlhttp.send(null);
}
else {
    alert("Your browser does not support XMLHTTP.");
}
}
function state_Change() {
if (xmlhttp.readyState == 4) { // 4 = "loaded"
    if (xmlhttp.status == 200) { // 200 = OK    
        var markers = xmlhttp.responseXML.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
            var name = markers[i].getElementsByTagName("name")[0].firstChild.nodeValue;
            //etc...
document.getElementById(target).innerHTML += '<li>' + name + '</li>\n';
        }
    }
    else {
        alert("Problem retrieving XML data");
    }
}
}

Вот HTML:

  <ul id="list_puncts">
<li><a href="javascript:;" onclick="loadXMLDoc('./content/geo_points/slovenia.xml','list_sl')">Republika Slovenija (RS)</a>
 <ul id="list_sl">
   <!--here should be some info from XML file-->
     </ul></li>
     <li><a href="javascript:;" onclick="loadXMLDoc('./content/geo_points/horvatia.xml','list_hr')">Republika Hrvatska (RH)</a>
    <ul id="list_hr">
    <!--here should be some info from XML file-->
    </ul></li>
   </ul>

Однако это не работает - после нажатия на ссылку загружается XML (это можно увидеть в Firebug), но вторая переменная - target - не может попасть в функцию state_Change, поэтому нет реальное действие сделано. Если target в document.getElementById(target).innerHTML заменяется статическим идентификатором (например, list_sl), он работает, но у меня есть много таких ссылок в HTML, не только в Словении и Хорватии, поэтому переменная настоятельно необходима.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 11 августа 2009

Если вы используете глобальные переменные (как для XMLHttpRequest s, так и для target s), вы не можете поддерживать параллельные запросы (т. Е. Пользователь нажимает на другую ссылку до того, как одна XMLHttpRequest вернется). Один из способов реализовать это - сохранить переменную xmlhttp в области действия loadXMLDoc и добавить target в качестве свойства к объекту XMLHttpRequest:

function loadXMLDoc(url, target) {
    var xmlhttp;
    // create XMLHttpRequest instance
    if(xmlhttp != null) {
        xmlhttp.onreadystatechange = state_Change;
        xmlhttp.targetListId = target;
        xmlhttp.open(); // etc.
    }
};

В вашей функции state_Change вы можете получить доступ к экземпляру XMLHttpRequest, используя свойство target события:

function state_Change(e) {
    var xmlhttp = e.target;
    // check readystate & status

    var targetList = document.getElementById(xmlhttp.targetListId);
    targetList.innerHTML = ''; // fill with data, etc.
};
1 голос
/ 11 августа 2009

Поместите логику state_Change в анонимную функцию в loadXMLDoc.

function loadXMLDoc(url,target) {
    // ... code to instantiate XMLHttprequest goes here ...

    if (xmlhttp != null) {
        xmlhttp.onreadystatechange = function() {
            // Your state_Change() logic goes here.
            // This has access to the variable "target" because
            // it's within the same enclosing function's scope.
        };
        xmlhttp.open("GET", url, true);
        xmlhttp.send(null);
    }
}

Недостатком этого является то, что каждый раз при вызове loadXMLDoc создается новый экземпляр функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...