【发布时间】:2013-02-08 08:55:15
【问题描述】:
我为此写了一篇类似的帖子,但由于过于本地化而被关闭。经过一番研究和测试,我想我找到了问题的根源,这个问题应该得到更好的解释,希望对你有帮助。
使用 XMLHttpRequest 我需要转到一个页面,模拟鼠标点击,然后获取一些内容。这是我写的代码:
var sendToLog;
var xhr = new XMLHttpRequest();
xhr.open('GET', '/newsfeed-simulator', true);
xhr.responseType = 'document';
xhr.onload = function(e) {
if (this.status == 200)
{
var event = xhr.response.createEvent("MouseEvents");
event.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0,
false, false, false, false,
0, null);
xhr.response.getElementById("simulate-button").dispatchEvent(event);
$(xhr.response).ready(function()
{
console.log(xhr.response.body);
sendToLog = xhr.response.getElementsByClassName("story-score");
});
chrome.extension.sendMessage({writeToLog: sendToLog});
}
}
xhr.send();
问题是点击事件不起作用。也尝试过xhr.response.getElementById("simulate-button").click(); 无济于事。
不确定是什么问题?这应该是直截了当的事情:转到一个页面,等待它加载,单击一个按钮,等待它再次加载,然后从 DOM 获取内容。
任何帮助将不胜感激。
提前谢谢你
EDIT 删除了第二个 onload,并添加了 xhr.response。现在它在没有鼠标点击的情况下打印 DOM 到控制台。仍然不是我需要的,但也许这是朝着正确方向迈出的一步
EDIT2:根据this post 和其他人的说法,最好不要使用click,因为它只适用于IE。所以我编辑了我的代码,但直到没有工作......无赖
EDIT3 作为 Fabien Quatravaux,这里的问题是 ajax 请求响应没有加载到当前 DOM 中,所以我无法调用该事件(我可以但它不会做任何事情)。所以问题是我如何使用 xmlhttprequest,转到使用的页面,触发事件,然后获取生成的 DOM?再次感谢 Fabien 指出这一点。
【问题讨论】:
-
您是否尝试在 ajax 响应主体上触发事件,就好像它已加载到 DOM 中一样?如果我错了,请阻止我,但 ajax 请求响应未加载到当前 DOM 中,因此您无法在其上执行脚本,如果它已被解析为文档。看看XMLHttpRequest spec:第 5-4 点说“禁用脚本”;
-
哇,我认为您是正确的,感谢您澄清这一点!您知道是否有一种方法可以使用 xmlhttprequest 访问页面,触发事件然后获取生成的 DOM?我这样做的方式显然不是正确的。
-
我认为您没有找到正确的方向。您正在尝试使用您无法控制的代码(存在于您指向的此 html 页面上的 javascript),并且尚未编写为您想要的代码。相反,您应该弄清楚这个按钮(或事件)在做什么,然后做同样的事情。也许您要单击的按钮正在向服务器发送请求,也许它只是取消隐藏页面上已经存在的 HTML 节点,...查看该页面的事件处理程序代码并尝试执行相同操作(注意跨域问题)。
标签: javascript jquery ajax google-chrome-extension xmlhttprequest