我遇到了一些 array[i] 未定义的错误,我找不到解决它的方法更新

问题描述 投票:0回答:1

我在调度中心工作,我们使用“Astrid Netviewer”来规划我们的团队。 Netviewer 在 Firefox 浏览器中运行。我们被告知使用Netviewer的方式非常耗时,而且非常麻烦。

由于 Netviewer 是基于浏览器的,我想:“为什么不应该自动化呢?”使用 JavaScript。

我将尝试向您简单解释该过程。在第一页,我们有几行/列。 “Ploeg ID”是团队的意思,每个团队都有几个员工,你可以在“人员”一栏中找到员工,每个员工都有自己的44xxxxx号码。

foto1

每个班次、一天结束时,我们都需要清除每个“Ploeg ID”中的所有信息。

我们该怎么做,在“Ploeg ID”栏中我们点击相应的“Ploeg ID”,例如GENT2203。我们被重定向到一个网页,例如

/netviewer/UnitID=GENT2203
。在该页面上,我们需要单击
"wis alle personeel/toestellen"

foto2

我们必须为超过 40 个团队执行此操作,每天 3 次...

我想做的是编写一个脚本,在html表中找到所有“PLOEG ID”,将它们放入一个数组中,删除数组中所有不必要的信息,循环遍历数组,打开'

"/netviewer/UnitID="+array[1]
' 并执行两次
get.Element
单击。

使用以下代码可以过滤掉“Ploeg ID”、“员工编号”并将它们全部放入一个数组中。我使用以下代码来执行此操作:

var tableObj = document.getElementById( "UnitItems" );
var arr = [];
var allTRs = tableObj.getElementsByTagName( "tr" );


for ( var trCounter = 0; trCounter < allTRs.length; trCounter++ )
{
    var tmpArr = [];
    var allTDsInTR = allTRs[ trCounter ].getElementsByTagName( "a" );
    for ( var tdCounter = 0; tdCounter < allTDsInTR.length; tdCounter++ )
    {
        tmpArr.push( allTDsInTR[ tdCounter ].innerHTML );
    }
    arr.push( tmpArr );
}
console.log( arr );

html代码(对不起图片):

foto3

我用上面的代码得到的结果:

foto4

如你所见,我得到了一个嵌套数组,并且只需要该嵌套数组的第一个值,所以

arr[2][0]

但此时我陷入了困境......并且出现了错误。

这是我到目前为止的代码。因为我只需要 GENTXXXX 将

arr[]
中的第一个值推入新的
arrClear[]
中。

var tableObj = document.getElementById( "UnitItems" );
var arr = [];
var allTRs = tableObj.getElementsByTagName( "tr" );
var arrClean = [];


for ( var trCounter = 0; trCounter < allTRs.length; trCounter++ )
{
    var tmpArr = [];
    var allTDsInTR = allTRs[ trCounter ].getElementsByTagName( "a" );
    for ( var tdCounter = 0; tdCounter < allTDsInTR.length; tdCounter++ )
    {
        tmpArr.push( allTDsInTR[ tdCounter ].innerHTML );
    }
    arr.push( tmpArr );
}
//console.log( arr );

for (var j = 1; j < arr.length; j++){

        arrClean.push(arr[j][0]);
        arrClean[j] = arrClean[j].toString();   
        //window.open("/NetViewer/LineupsCommand/AddUnitInformation?unitID="+arrClean[j]+"&lineupName=Z_GENT_1_INT_MAANDAG_2&agencyID=Z_GENT", "_self");
        //document.getElementById("btnResetAllEmployees").click();
        //document.getElementById("btnAddUnitInformation").click();
}

但我收到以下错误“未捕获的类型错误:arrClean [j]未定义”。由于 typeError,我在

arrClean[j] = arrClean[j].toString();
后面添加了
arrClean.push(arr[j][0]);
?但这并不能解决问题。

如果我取消命令 window.open arrclean[j],我会得到

/NetViewer/LineupsCommand/AddUnitInformation?unitID=undefined&lineupName=Z_GENT_1_INT_MAANDAG_2&agencyID=Z_GENT

你能帮我找到解决未定义错误的方法吗?或者也许有一个更短的方法来解决我的问题??

我也尝试过,用 let 代替 var,但这似乎不起作用。我在堆栈上发现的第二个可能的解决方案是使用 foreach 而不是常规的 for 循环,..但我无法理解它...

感谢您的努力!

更新:

你好!

我的“项目”花了一些时间,在你的帮助下我得到了下一个结果。

const tds = document.querySelectorAll("#UnitItems td");
let ids = [];

tds.forEach((td) => {
    if (td.textContent.includes("GENT")) {
        spatieWeg = td.textContent.replace(/\s/g, "");
        ids.push(spatieWeg);
    }
});

console.log("extractGent done");
console.log(ids);
debugger; //to check if ids got all the correct values in it.

function processWindow(i) {
    var newWindow = window.open("/NetViewer/LineupsCommand/AddUnitInformation?unitID=" + ids[i] + "&lineupName=Z_GENT_1_INT_MAANDAG_1&agencyID=Z_GENT", "_self");

    newWindow.addEventListener('load', function() {
        var resetButton = newWindow.document.getElementById('btnResetAllEmployees');
        if (resetButton) {
            resetButton.click();
        }

        var addButton = newWindow.document.getElementById('btnAddUnitInformation');
        if (addButton) {
            addButton.click();
        }
    });
}

for (var i = 0; i < ids.length; i++) {
    console.log(ids[i]);
    processWindow(i);
}

我现在遇到的问题是这样的。首先,“ids”中有 25 个值,当运行函数 processWindow(i) 时,它会从“ids”中获取第 24 个值。不是值 0。之后,由于第二个问题,代码停止运行。

第二个问题,即使打开24the值,它也不会自动执行两次点击。

我已经在按钮前面尝试了

setTimeOut '5000'
。点击。但它只是不“点击”。我使用 setTimeOut 因为我认为页面需要时间才能完全加载。

在控制台中我尝试使用

document.getElementById('btnResetAllEmployees').click()
,这似乎有效。

代码执行的顺序是否正确?

我不明白,...如果您需要更多信息,我想听听。

非常感谢!

javascript arrays undefined
1个回答
0
投票

我用你的图片制作了一个粗略的 HTML。

对于我的答案,我使用 querySelectorAll 来获取表的所有 TD。

然后我循环遍历它们并查看 textContent 是否包含 GENT(这可以很容易地更改)。如果是,则推送 textContent,这将忽略锚点和其他 HTML。

const tds = document.querySelectorAll("#UnitItems td");
let ids = [];
tds.forEach((td) => {
  if (td.textContent.includes("GENT")) {
    ids.push(td.textContent)
  }
});

ids.forEach((id) => {
  console.log("/NetViewer/LineupsCommand/AddUnitInformation?unitID=" + id + "&lineupName=Z_GENT_1_INT_MAANDAG_2&agencyID=Z_GENT", "_self");
});
<table id="UnitItems">
  <tr>
    <td></td>
    <td><a href="">GENT202</a></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td></td>
    <td><a href="">GENT2023</a></td>
    <td></td>
    <td></td>
  </tr>

  <tr>
    <td></td>
    <td><a href="">GENT2025</a></td>
    <td></td>
    <td></td>
  </tr>
</table>

© www.soinside.com 2019 - 2024. All rights reserved.