当我在nightmarejs中单击ajax时如何使用回调

时间:2016-10-11 08:37:26

标签: ajax node.js web-crawler jquery-callback nightmare

最近我一直在研究噩梦模块,我觉得它非常简单实用,但我有疑问。

单击ajax按钮时如何使用回调

mycode的

var Nightmare = require('nightmare'),
    nightmare = Nightmare();

nightmare
.goto('https://motul.lubricantadvisor.com/Default.aspx?data=1&lang=ENG&lang=eng')
.click('input[title="Cars"]')
.wait(1000)
.evaluate(function () {
    //return $('#ctl00_ContentPlaceHolder1_lstModel option');
    var links = document.querySelectorAll('#ctl00_ContentPlaceHolder1_lstMake option');
    return [].map.call(links, function (e) {
        return {value: e.value, name: e.text};
    });
})
.end()
.then(function (items) {
    console.log(items);
});

有等待方法。大多数人使用等待我搜索谷歌搜索

.wait(1000)

我没有使用等待方法。因为如果它的网络断开或慢。这不是好代码

你能帮我回调一下吗?

感谢。所以我已经激活了代码,但它没有工作

var Nightmare = require('nightmare'),
    nightmare = Nightmare();

nightmare
.goto('https://motul.lubricantadvisor.com/Default.aspx?data=1&lang=ENG&lang=eng')
.click('input[title="Cars"]')
.wait('#result > #ctl00_ContentPlaceHolder1_lstMake option')
.evaluate(function () {
    $(document).ajaxSuccess(function () {
         var links = document.querySelectorAll('#ctl00_ContentPlaceHolder1_lstMake option');
         return [].map.call(links, function (e) {
            return {value: e.value, name: e.text};
        });
    });
})
.end()
.then(function (items) {
    console.log(items);
});

2 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。最简单的是以下内容。

假设Ajax请求完成时,它总是会改变页面上的内容。在等待CSS选择器可以匹配的特定元素时,可以很容易地检测到大多数这些更改。

我们假设您单击某个内容,结果将写入"#result"匹配的元素中。如果在点击之前没有这样的元素,那么你可以等到这个元素的存在:

.click("button")
.wait("#result")
// TODO: do something with the result

您还可以使用CSS选择器来计算内容。例如,我们假设有十个元素可以与"#result > a"匹配。如果点击再添加10个,那么您可以使用以下方式等待第20个:

.click("button")
.wait("#result > a:nth-of-type(20)")
// TODO: do something with the result

CSS选择器的世界非常大。

当然,您可以使用evaluate添加一般的Ajax事件处理程序,如$(document).ajaxSuccess(fn),以便在某些回调完成时收到通知,但页面的源代码会一直更改。如果您要查找可以在DOM中看到的结果,那么维护代码会更容易。

答案 1 :(得分:-1)

使用这个,ajax回调..

  $.ajax(url,{dataType: "json", type: "POST" })
        .then(function successCallback( data ) { //successCallback
        console.log(data);
   }, function errorCallback(err) { //errorCallback
       console.log(err);
       });
  // console.log(2);
});