我正在编写一个可以自动执行一些浏览器操作的JS脚本。
使用get_baskets_onclicks
,我从某些DOM元素中收集onclick函数,并将它们以数组形式返回。每个onclick看起来像这样:
onclick="PrimeFaces.ab({s:"j_id_32:GenerationTable:0:j_id_1e_2_3p",u:"@widgetVar(GenerationCodingDialog)",onco:function(xhr,status,args){PF('GenerationCodingDialog').show();}});return false;"
并打开一个弹出窗口,我需要使用get_MAP_data
从中收集一些数据。
此外,每个函数都在get_MAP_data
内部调用。
问题是我无法让代码等待打开弹出窗口,因此get_MAP_data
返回的数据为空。
除了下面的document.readyState === 'complete'
外,我还尝试了window.onload = function(){}
,但无济于事。
是否可以让浏览器(Chrome)等待?我想我不能使用jQuery,因为这不是我的网页。
function get_baskets_onclicks() {
// returns array of functions that launch MAP dialogs
var baskets = Array.from(document.getElementsByClassName("ui-commandlink ui-widget margin-right-5px"));
var baskets_onclicks = baskets.map(basket => basket.onclick);
return baskets_onclicks;
};
function get_MAP_data(basket_onclick) {
basket_onclick()
if (document.readyState === 'complete') {
console.log("PAGE LOADED");
// wait here for the dialog to open
// dt = detail table
var MAP_data = {} // container for transaction details
var labels_to_get = ['Description', 'Category', 'Department', 'Justification', 'My Shop Voucher', 'My Shop Coding'];
var all_dts = document.getElementsByClassName('summary-details-grid');
var dt = Array.from(all_dts).filter(table => table.parentElement.id == "paymentGenerationmyShopCodingForm")[0];
var dt_body = dt.children[0];
var dt_trs = Array.from(dt_body.children) ;
dt_trs.forEach(function(tr) {
tds = Array.from(tr.children);
tds.forEach(function(td) {
var label = td.textContent;
if (labels_to_get.includes(label)) {
var value_for_label = tds[1].textContent;
MAP_data[label] = value_for_label;
console.log(label, value_for_label);
};
});
});
// console.log(MAP_data);
return MAP_data;
};
};
var first_onclick = get_baskets_onclicks()[0];
get_MAP_data(first_onclick);
答案 0 :(得分:0)
https://developer.mozilla.org/en-US/docs/Talk:DOM/window.setTimeout
http://mdn.beonex.com/en/DOM/window.setInterval.html
重试,setTimeout,setInterval和while循环的组合,我不确定特定模式的最佳方法,但是其中一个选项应该适合轮询DOM结果,直到有东西出现或尝试了很多次为止。
答案 1 :(得分:0)
一个小的修补程序是使您的代码轮询所检查元素的存在。
let interval = setInterval(() => {
var all_dts = document.getElementsByClassName('summary-details-grid');
if (all_dts.length !== 0) {
// Found some elements, now lets run the code
clearInterval(interval);
get_MAP_data(first_onclick);
}
}, 100);
这将每十秒检查一次summary-details-grid
类,并在找到它们时运行代码。