1

我为此写了一篇类似的帖子,但由于过于本地化而被关闭。经过一番研究和测试,我想我找到了问题的根源,这个问题应该得到更好的解释,希望对你有帮助。

使用 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:根据这篇文章和其他人,最好不要使用点击,因为它只适用于 IE。所以我编辑了我的代码,但直到不起作用......真可惜

EDIT3作为 Fabien Quatravaux,这里的问题是 ajax 请求响应没有加载到当前的 DOM 中,所以我无法调用该事件(我可以但它不会做任何事情)。所以问题是我如何使用 xmlhttprequest,转到使用的页面,触发事件,然后获取生成的 DOM?再次感谢 Fabien 指出这一点。

4

3 回答 3

0

我认为 XmlHttpRequest 没有响应属性。我认为您可能会使用 responseText 并操作 DOM(即添加一个按钮)——然后您可以单击该按钮并创建另一个 XmlHttpRequest。

编辑:

我的立场是正确的,我看到它确实有一个 - 我从来没有以这种方式使用它。

我认为更大的问题是假设您在响应中取回一个文档并且您找到一个按钮并导致点击事件,那么应该发生什么。我认为您没有与点击事件相关联的任何内容。

我也同意其他帖子,您绝对应该使用 jQuery。似乎您只是在尝试调用连续的 AJAX 请求,不是吗?

于 2013-02-22T17:05:07.890 回答
0

作为 Fabien Quatravaux,这里的问题是 ajax 请求响应没有加载到当前 DOM 中,所以我无法调用该事件。我通过打开一个新标签并直接进入该页面解决了这个问题。这个解决方案的缺点是用户可以看到这个选项卡,但至少它可以工作。

谢谢大家帮忙。

于 2013-02-23T13:03:27.763 回答
-1

修改 xhr.response.getElementById("simulate-button").click(); 到 document.getElementById("simulate-button").click();

删除 $(xhr.response).ready 函数

修改 sendToLog = xhr.response.getElementsByClassName("story-score"); 到 sendToLog = document.getElementsByClassName("story-score");

于 2013-02-22T19:23:28.020 回答