javascript - getElementsByTagName 不适用于 Cordova 中的 InAppBrowser
问题描述
我们的网站已加载到我们的 Cordova 应用程序的 InAppBrowser 中,我正在尝试使用这样的 executeScript 获取所有链接标签:
getAllLinks() {
inappbrowser.executeScript({
code: "(function(){ \
return document.getElementsByTagName('a'); \
})();"
},function(values){
console.log("length values = " + values.length); // length is always 1
for(var x=0; x < values.length; x++) {
var href = values[x].href;
console.log("href = " + href);
}
});
}
// loadstop_handler:
loadstop_handler(evt: InAppBrowserEvent) {
if (device.platform == "Android") {
this.getAllLinks();
}
}
// loadstop handler is added to event listener:
inappbrowser.addEventListener('loadstop', (event) => this.loadstop_handler(event));
但是我没有得到链接。它返回一个空对象,并且 href 始终未定义。打开应用程序时,主页上大约有 10 个链接。我在 loadstop 事件中调用此方法。我们正在使用 Cordova 8.1.0 有人可以帮忙吗?我怎样才能得到链接?
编辑
根据此链接似乎: https ://dbwriteups.wordpress.com/2016/01/24/sharing-data-between-hybrid-app-and-inapp-browser/ 您无法访问该网站的 DOM在 InAppBrowser 中加载。这是一个不同的背景。这就是为什么 document.getElementByTagName 在 executeScript 中返回 undefined 的原因。
所以我应用了上述链接提供的解决方案。这并不理想,因为我必须从网站在本地存储中设置数据(如:在网站代码本身中),如下所示:
// Code executed in website:
setLocalStorageForApp() {
setTimeout(() => { // waiting for DOM to load
let links = document.getElementsByTagName('a');
var linkArray = new Array<string>();
for (var x = 0; x < links.length; x++) {
var href = links.item(x).href;
linkArray.push(href);
}
console.log('Total links = ' + linkArray.length); // result is 63
localStorage.setItem('linkArray', JSON.stringify(linkArray));
}, 1000);
}
然后在 Cordova 应用程序中,我可以从本地存储中获取 a 标签:
var links = null;
inappbrowser.executeScript({ code: "localStorage.getItem('linkArray')" }, function(values) {
links = JSON.parse(values[0]);
console.log(links); // prints all 63 links from web page
});
因此,您无法从应用程序访问在 InAppBrowser 中加载的网站的上下文。共享数据(显然包括“文档”)的唯一方法是通过本地存储。如果我有这个错误或有人知道不需要我修改网站本身代码的更好的解决方案,请告诉我。我已经尝试了一切,试图从网站的 DOM 中获取元素,但一切都失败了。
解决方案
返回参数始终包装在单个元素数组中。尝试这个:
getAllLinks() {
inappbrowser.executeScript({
code: "(function(){ \
return document.getElementsByTagName('a'); \
})();"
},function(values){
values = values[0]; // destructure single element array
console.log("length values = " + values.length);
for(var x=0; x < values.length; x++) {
var href = values[x].href;
console.log("href = " + href);
}
});
}
推荐阅读
- r - 在 Pandas 数据框中迭代并有条件地附加字符串值
- uwp - UWP - NavigationView 控件 - PaneDisplayMode 属性不存在
- python - 将我的 CSV 与 LOG 文件匹配:值的长度与使用 pandas 的索引长度不匹配
- r - 在R中显示类似结构的gridview?
- java - WCMS 中的客户群 - Hybris 6.2
- android - Charles 代理未显示来自 Nexus 7 的流量
- r - 如何计算要在折线图中使用的变量中一个值的比例?
- c# - 用另一个变量分配非静态数据成员变量
- linux - 如何启用 docker-proxy
- java - 使用 java if-else