код javascript не отображает данные из xml-файла

#javascript #html #xml

#javascript #HTML #xml

Вопрос:

Я читаю XML-файл с помощью javascript, и если пользователь нажимает на кнопку «забыли пароль», появляется модальное окно, где есть другая кнопка под названием «получить мой пароль». Если пользователь нажимает на эту кнопку, предполагается, что пароль пользователя отображается на основе его идентификатора электронной почты в xml-файле, но моя функция по какой-то причине не работает. моя HTML-форма:

 <div class="container">
  <div class="login">
  <h1 class="login-heading">Please login.</h1>
<form method="post" action="login.php">
<input id='email1' type="email" name="email" placeholder="Email Adress" required="required" class="input-txt" onchange="checkuser();"  /> amp;nbsp;
        <input id='pass1' type="password" name="password" placeholder="Password" required="required" class="input-txt" />
        
        <input type"button" name="forgot" class="btn" data-target="#pwdModal" data-toggle="modal" value="Forgot password?">
<div id="pwdModal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
  <div class="modal-dialog">
  <div class="modal-content">
      <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
          <h1 >Forgot My Password?</h1>
      </div>
      <div class="modal-body">
          <div class="col-md-12">
                <div class="panel panel-default">
                    <div class="panel-body">
                        <div class="text-center">
                          
                          <p>If you have forgotten your password, simply click on the button below to fetch your password from the server!</p>
                            <div class="panel-body">
                                <fieldset>
                                    
                                    <div id="forgot">
             <input type="button" class="btn" value="Get my password" tabindex="2" onclick="forgotten();"><br> <br>
                         <p id="pass" style="border-style:dotted;border-color:coral; border-radius:5px;"></p>
</div>   
          </fieldset>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
      </div>
      <div class="modal-footer">
          <div class="col-md-12">
          <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
          </div>    
      </div>
  </div>
  </div>
</div>
<button type="submit" class="btn" name="ok" id="b1" >Sign in </button> <br><br></form>
<script>
             
//checking if the email exists in the server xml or not
var first_email = document.getElementById("email1");
var forgotten_pass='';

var request = new XMLHttpRequest();

//creating an array of the existing emails
request.open("GET", "storedata.xml", false);
request.send();

var xml = request.responseXML;
var users = xml.getElementsByTagName("data");
const existingEmails = [];

for(var i = 0; i < users.length; i  ) {
    const emailTag = users[i].getElementsByTagName("email2");
    const email = emailTag[0].childNodes[0].nodeValue;

    existingEmails.push(email);
}

function checkuser() {
 if(existingEmails.includes(first_email.value)) {
      email1.setCustomValidity('');
 }
 else {
 email1.setCustomValidity('Sorry but this email address doesnt exist in the server.');
 }
}

//grabbing the forgotten password 
function forgotten {
for(var i = 0; i < users.length; i  ) {
    if (first_email == users[i].getElementsByTagName("email2") {
    forgotten_pass= users[i].getElementsByTagName("pass2");
    }
    
} document.getElementById("pass").innerHTML=forgotten_pass;
}
</script>        
 
  </div>
</div>
  

Комментарии:

1. Использование false для асинхронности устарело (потому что это ужасная практика) и никогда не должно использоваться. Используйте прослушиватель событий для доступа к данным и их обработки. Вы должны видеть предупреждения об устаревании в консоли инструментов разработчика браузера

Ответ №1:

Вы не пробовали async?

 var request = new XMLHttpRequest();

request.open("GET", "storedata.xml", true);

request.onreadystatechange=function(){

 if((this.readyState==4)amp;amp;(this.status==200)){

   var xml = request.responseXML;

   // etc etc etc

 }

};

request.send();
  

Комментарии:

1. Я пробовал подобное, function loadXMLDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 amp;amp; this.status == 200) { for(var i = 0; i < users.length; i ) { if (first_email == users[i].getElementsByTagName("email2") { forgotten_pass= users[i].getElementsByTagName("pass2"); } } }document.getElementById("pass").innerHTML=forgotten_pass; ; xhttp.open("GET", "storedata.xml", true); xhttp.send(); } } но это все еще не работает, я новичок в этом, не могли бы вы, пожалуйста, пояснить, как это должно быть сделано?

2. Я думаю, что проблема в том, как я получаю переменную forgotten_pass, я был бы очень признателен, если бы вы могли мне помочь

3. Изменить: var xml = request.responseXML; на var xml = this.responseXML;

4. Используйте … alert(this.responseText); для ТЕСТИРОВАНИЯ перед циклами.

5. это не работает, должен ли я создать два отдельных скрипта и перенести забытую функцию прямо под модальным, где я вызываю функцию?

Ответ №2:

Если есть ошибка, эта версия сообщит вам … просто установите URL и протестируйте его.

 var X=new XMLHttpRequest(); X.open('GET',URL,true); X.responseType='text';

X.onreadystatechange=function(){

 if(X.readyState==4){

  if(X.status==200){

    alert(X.responseText); // Observe the text, is it empty?

  } else {alert(X.statusText);}  // observe the error

 }

};

X.send();
  

Комментарии:

1. Тогда он даже не запускается! Поместите это в функцию и вызовите ее следующим образом… <body onload=»myFunc();»> Послушай, возможно, этот проект слишком сложен для тебя! 🙂

2. var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 amp;amp; this.status == 200) { myFunction(this); } }; xhttp.open("GET", "storedata.xml", true); xhttp.send();

3. function myFunction(xml) { var xmlDoc = xml.responseXML; //need to create a loop to loop through the data tags in the xml file var data_tag = xmlDoc.getElementsByTagName('data')[i]; var email_tag = data_tag.childNodes[0].nodeValue; var pass_tag= data_tag.childNodes[3].nodeValue; }

4. это то, что я написал, не могли бы вы просто помочь мне разобраться, как создать цикл для перебора всех тегов данных в XML-файле, пожалуйста?