JavaScript 函数无法识别同一文档中的变量

javascript function can't recognize variable in same document

本文关键字:文档 变量 函数 识别 JavaScript      更新时间:2023-09-26

我需要一些基本的Javascript问题的方向。

我正在制作一个 ejs 页面来显示用户信息。

  1. 当我加载此页面时,我以数组形式获取"userList"数据。 然后我将它们放入 vUserList 数组中供将来使用。当调用函数"showUserInfo"时,我将信息放入文档中。

我有两个问题。

当我在同一标签中使用 for 循环和函数时,该函数根本不起作用。当我将 for 循环和函数拆分为不同的标签时,两者都有效,但函数无法识别虚拟用户列表数组。

如何让函数识别数组变量?

这是我的页面代码。

谢谢。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script>
        var vUserList = new Array();
        <% for (var i = 0; i < userList.length ; i++) { %>
            vUserList[<%=i %>] = new Array();
            vUserList[<%=i %>].googleUid = <%=userList[i].googleUid %>;
            vUserList[<%=i %>].googleName = <%=userList[i].googleName %>;
            vUserList[<%=i %>].memberUid = "<%=userList[i].memberUid %>";
            vUserList[<%=i %>].clientVersion = <%=userList[i].clientVersion %>;
            vUserList[<%=i %>].deviceId = <%=userList[i].deviceId %>;
            vUserList[<%=i %>].ticket = <%=userList[i].ticket %>;
            vUserList[<%=i %>].joinTime = <%=userList[i].joinTime %>;
            vUserList[<%=i %>].loginTime = <%=userList[i].loginTime %>;
            vUserList[<%=i %>].feni = <%=userList[i].feni %>;
            vUserList[<%=i %>].fuel = <%=userList[i].fuel %>;
            vUserList[<%=i %>].itemAttackCount = <%=userList[i].itemAttackCount %>;
            vUserList[<%=i %>].lastStation = <%=userList[i].lastStation %>;
            vUserList[<%=i %>].clearCount = <%=userList[i].clearCount %>;
            vUserList[<%=i %>].playLevel = <%=userList[i].playLevel %>;
            vUserList[<%=i %>].tutorial = <%=userList[i].tutorial %>;
            vUserList[<%=i %>].fuelChargeTime = <%=userList[i].fuelChargeTime %>;
            vUserList[<%=i %>].fuelTime = <%=userList[i].fuelTime %>;
            vUserList[<%=i %>].level = new Array();
            vUserList[<%=i %>].level = <%=userList[i].level %>;
        <% } %>
    </script>
    <script>
        function showUserInfo(idx) {
            alert(vUserList[0].memberUid);
            document.getElementById("googleUid").innerHTML=vUserList[idx].googleUid;
            document.getElementById("googleName").innerHTML=vUserList[idx].googleName;
            document.getElementById("memberUid").innerHTML=vUserList[idx].memberUid;
            document.getElementById("clientVersion").innerHTML=vUserList[idx].clientVersion;
            document.getElementById("deviceId").innerHTML=vUserList[idx].deviceId;
            document.getElementById("ticket").innerHTML=vUserList[idx].ticket;
            document.getElementById("joinTime").innerHTML=vUserList[idx].joinTime;
            document.getElementById("loginTime").innerHTML=vUserList[idx].loginTime;
            document.getElementById("feni").innerHTML=vUserList[idx].feni;
            document.getElementById("fuel").innerHTML=vUserList[idx].fuel;
            document.getElementById("itemAttackCount").innerHTML=vUserList[idx].itemAttackCount;
            document.getElementById("lastStation").innerHTML=vUserList[idx].lastStation;
            document.getElementById("clearCount").innerHTML=vUserList[idx].clearCount;
            document.getElementById("playLevel").innerHTML=vUserList[idx].playLevel;
            document.getElementById("tutorial").innerHTML=vUserList[idx].tutorial;
            document.getElementById("fuelChargeTime").innerHTML=vUserList[idx].fuelChargeTime;
            document.getElementById("fuelTime").innerHTML=vUserList[idx].fuelTime;
        }
    </script>

</head>
<body>
    <div id="header">
        <% include menubar.ejs %>
    </div>
    <div id="userList" vertical-align=bottom align=left>
        Here will be UserList from DB<br>
        <form method="post" action="/getUserList">
            memberUid<input type="text" name="memberUid"><br>
            LastStation<input type="text" name="startStation">~<input type="text" name="endStation"><br>
            Number of List <select name="limitNum">
                        <option value="10">10</option>
                        <option value="30">30</option>
                        <option value="50">50</option>
                    </select><br>
            <input type="submit" value="Search">
        </form>
        <% if (userList != null) {
            for (var i = 0; i < userList.length; i++) { %>
                <a href="#" onclick="showUserInfo(<%= i %>); return false;"><%= userList[i].memberUid %></a> <br>
                <% console.log(userList[i].memberUid) %>
        <% } } %>
    </div>
    <div align=center vertical-align=bottom>
        user Information. <br>
        googleUid : <p id="googleUid"></p>
        googleName : <p id="googleName"></p>
        memberUid : <p id="memberUid"></p>
        clientVersion : <p id="clientVersion"></p>
        deviceId : <p id="deviceId"></p>
        ticket : <p id="ticket"></p>
        joinTime : <p id="joinTime"></p>
        loginTime : <p id="loginTime"></p>
        feni : <p id="feni"></p>
        fuel : <p id="fuel"></p>
        itemAttackCount : <p id="itemAttackCount"></p>
        lastStation : <p id="lastStation"></p>
        clearCount : <p id="clearCount"></p>
        playLevel : <p id="playLevel"></p>
        tutorial : <p id="tutorial"></p>
        fuelChargeTime : <p id="fuelChargeTime"></p>
        fuelTime : <p id="fuelTime"></p>
    </div>
</body>
</html>

变量 vUserList 不在函数 showUserInformation 的范围内。你必须在函数的作用域中声明(var 步骤)变量,因为 javascript 使用函数级作用域。必须将所有代码放在单个脚本标记中。弄清楚为什么这不起作用。我认为这只是一个格式问题。并将变量放在showUserInfo函数中。

不过,肮脏的黑客可能对您有用。从 vUserList 的声明中删除单词"var"。然后,它将污染全局名称空间。但是您应该能够从窗口中的任何位置访问它。尽管如此,我不会建议你走这条路。

只是一个评论(需要空间),一些建议

在第一个循环中,您正在执行:

var vUserList = new Array();
<% for (var i = 0; i < userList.length ; i++) { %>
    vUserList[<%=i %>] = new Array();
    vUserList[<%=i %>].googleUid = <%=userList[i].googleUid %>;
    vUserList[<%=i %>].googleName = <%=userList[i].googleName %>;
    ...

这会将数组分配给 vUserList[i],然后将其视为对象。这是有效的,因为数组是对象,但它没有使用任何数组的优点,所以你应该使用一个对象,并且使用文字而不是调用构造函数被认为是更干净的,所以:

  vUserList[<%=i %>] = {};
  ...

为了使事情更简洁一些,您可以使用如下所示的文字:

    vUserList[<%=i %>] = { googleUid: <%=userList[i].googleUid %>,
                           googleName: <%=userList[i].googleName %,
                           ...
                           fuelTime: <%=userList[i].fuelTime %>,
                           level: [<%=userList[i].level %>]
                          };

另外,请考虑对 showUserInfo 函数使用循环和数据数组:

function showUserInfo(idx) {
  var userData = ['googleUid','googleName','memberUid','clientVersion','deviceId',
    'ticket','joinTime','loginTime','feni','fuel','itemAttackCount','lastStation',
    'clearCount','playLevel','tutorial','fuelChargeTime','fuelTime'];
  userData.forEach(function(v) {
    document.getElementById(v).innerHTML = vUserList[idx][v];
  });
}

您可以将类似的策略应用于第一个循环。

呵。