0

因此,這是我嘗試編輯我以前的帖子後再花兩天時間並進行一些試驗和錯誤。在Firebase上登錄後路由

更具體地說,我需要幫助的是根據輸入的電子郵件或管理員標識號路由到特定頁面。您現在登錄後,firebase會驗證您在數據庫中有一個帳戶,並且此功能底部的while循環會被設置爲正確的地圖。

但是,如果您使用數據庫中不存在的電子郵件登錄,那麼錯誤處理將提醒一個錯誤,但它不能做更多的事情。 IT不能做我需要做的事情,那就是斷開或返回,並停止該功能 - 我假設它不能這樣做,因爲它的範圍不允許它影響整個功能。我試圖把while循環放在錯誤處理的條件中,但是似乎沒有做任何事情,因爲當我嘗試登錄時什麼也沒有發生。我甚至嘗試使用一個變量來添加(+1),然後如果它多於0而不運行while循環,但是我記得錯誤處理的範圍實際上不會改變全局變量,因此它無法訪問該變量。

這讓我發瘋 - 我只是需要dam代碼來運行while循環,如果errorCode或errorMessage出現的話。請代碼領主給我一些指導。

代碼,因爲它代表...

<!-- <a ="btn-signup" href="#signup">sign up </a> --> 
    <div class="btn-signin" id="btn-signin"> 
    <form action="javascript: submitform()" method="get" id="myForm"> 
    <input type="email" name="email" id="emailInput" placeholder="Enter School Email"> 
    <input type="password" name="password" id="passwordInput" placeholder="Enter Password"> 
    <input type="text" name="uniqueID" id="myAdminID" placeholder="Admin ID *if applicable*"> 
    <input type="submit" id="emailSubmit" value="Submit">  
    </form> 
    </div> 
    <!-- Routing based on email ending "@fordham.edu" --> 
    <script type="text/javascript"> 
    function submitform() { 
     var email_input = document.getElementById("myForm").elements.namedItem("email").value; 
     var password_input = document.getElementById("myForm").elements.namedItem("password").value; 
     var adminID = document.getElementById("myForm").elements.namedItem("uniqueID").value;   

     if ((email_input.indexOf('.edu') >= 0) && (password_input.length > 4)) { 
     firebase.auth().signInWithEmailAndPassword(email_input, password_input).catch(function(error) { 
      // Handle Errors here. 
      var errorCode = error.code; 
      var errorMessage = error.message; 
      if(errorCode === "auth/user-not-found") { 
       alert("User does not exist - go ahead and sign up first");     
      } else if(errorCode === "auth/wrong-password") { 
       alert("You might have the wrong password, try again"); 
      }   
      // ... 
     });     
     } else if ((adminID.indexOf('GJGBING') >= 0) && (password_input.length > 4)) { 
     firebase.auth().signInWithEmailAndPassword(email_input, password_input).catch(function(error) { 
      // Handle Errors here. 
      var errorCode = error.code; 
      var errorMessage = error.message; 
      if(errorCode === "auth/user-not-found") { 
       alert("User does not exist - go ahead and sign up first"); 
      } else if(errorCode === "auth/wrong-password") { 
       alert("You might have the wrong password, try again"); 
      }      
      // ... 
     });     
     } else { 
     alert("Please use a .edu email address or enter your unique Admin ID"); 
     return; 
     }; 


     var schools = ["@fordham.edu", "@sjsu.edu"]; 
     var mapLocations = ["#select-a-machine", "#select-a-machine"]; 
     var adminIdLocation = ["#select-a-machine"] 
     var adminIDs = ["GJGBING"]   
     var i = 0; 
     var a = 0; 

     while (a < adminIDs.length) { 
      if (adminID.indexOf(adminIDs[a]) >= 0) { 
       window.location.assign(adminIdLocation[a]); 
       break; 
      } else if (adminID.indexOf(adminIDs[a]) < 0) { 
       a++; 
      } 
     }; 


     while (i < schools.length) { 
      if(email_input.indexOf(schools[i]) >= 0) { 
       window.location.assign(mapLocations[i]); 
       break; 
      } else if(email_input.indexOf(schools[i]) < 0) { 
       i++; 
      } 
     }; 

     if(i >= schools.length && (email_input.indexOf('.edu') >= 0)) { 
      alert("We are currently not at your school"); 
     }; 

    }; 
    </script> 

回答

0

使用:嵌套條件的兩個層次內時

return; 

休息不工作。下面是我用來證明它的測試:

function test(){ 
for (i = 0; i < 10; i++) { 
    console.log(i); 
    if (i >= 5){ 
     console.log("great than five"); 
     while(i == 5){ 
      break; 
      console.log("break stops this conditional loop the function"); 
     } 
    } 
} 
    console.log("this will execute"); 
} 

凡相比,這種用法的回報,它殺死了整個功能:

function test(){ 
for (i = 0; i < 10; i++) { 
    console.log(i); 
    if (i >= 5){ 
     console.log("great than five"); 
     while(i == 5){ 
      return; 
      console.log("return kills this function, this won't log"); 
     } 
    } 
} 
    console.log("this won't execute"); 
} 
+0

我應該在哪裏放 - 我把它在條件內激活,如果有錯誤拋出?我試着在提醒前後放置它,但在兩種情況下,當我嘗試提交表單時,它什麼都不做。在控制檯中,我看到與它有關的兩個錯誤; 「submitform未定義」和未捕獲的SyntaxErrror:意外令牌。 – sergio

+0

我測試了這一點,我將編輯我的答案,該線程錯誤地說,將工作。較低的答案表明一個簡單的回報應該起作用。由於它嵌套在兩個級別的條件中,所以break不能以你擁有代碼的方式工作。但我做了一個測試,我將在上面進行編輯,向您展示它的工作原理。 –

+0

所以我添加了返回到我的代碼(檢查出來的原始文章),但問題是,當憑證是正確的,它什麼也沒做。它不會提示錯誤消息或代碼甚至路由。然而,如果用戶不存在,它會提示一條錯誤消息,並保持它的位置,這是一個積極的。有什麼想法嗎? – sergio

0

如果此功能被使用的的onsubmit功能,那麼您應在所需位置添加以下行:

return false; 

防止表單提交。見javascript: does onsubmit only execute when it detects a "return false"更多信息

編輯1: 我覺得你的問題是,您要添加到signInWithEmailAndPassword的執行誤差函數()由火力點在發生錯誤的情況下執行。當您看到提示您註冊的消息時,重新加載操作已經發生。您可以添加一條警報,顯示 錯誤消息和firebase提供的代碼。

如果你想在這種情況下,停止提交,取出location.reload if語句之前只是其他檢查線路的errorCode的值,如果

 }); 
    if (errorCode) { 
     return false; 
    } 
    } else if (adminID.indexOf('GJGBING') >= 0) { 
+0

我編輯原始帖子,以顯示它也鏈接的HTML也 – sergio

+0

正如我寫的,我建議並使用'return false;'當你想中止提交函數 – Guenther

+0

的任何地方提交感謝解釋 - 不幸的是它似乎沒有工作。發生同樣的事情。該警報被解僱告訴我,我應該註冊,然後我被路由到不同的位置 – sergio