как использовать обратный вызов, когда я нажимаю ajax в nightmarejs

#ajax #node.js #web-crawler #jquery-callback #nightmare

#ajax #node.js #веб-сканер #jquery-обратный вызов #кошмар

Вопрос:

в последнее время я изучаю модуль nightmarejs, я думаю, что это очень просто и полезно, но у меня есть вопрос.

как использовать обратный вызов, когда я нажимаю кнопку ajax

MyCode

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

nightmare
.goto('https://motul.lubricantadvisor.com/Default.aspx?data=1amp;amp;lang=ENGamp;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);
});
  

существует метод ожидания. большинство людей используют метод ожидания, который я искал в Google

 .wait(1000)
  

Я не использую метод ожидания. потому что, если это отключение от сети или медленно. Это плохой код

Не могли бы вы помочь мне метод обратного вызова??

Спасибо. Итак, я должен мотивировать код, но он не работает

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

nightmare
.goto('https://motul.lubricantadvisor.com/Default.aspx?data=1amp;amp;lang=ENGamp;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);
});
  

Ответ №1:

Есть много способов решить эту проблему. Самым простым было бы следующее.

Предположим, что когда запрос 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. спасибо вам за ваш ответ. Это не работает. не могли бы вы проверить мой код? Я сформулировал свой вопрос. Это очень сложно.

2. Почему вы используете ajaxSuccess ? Разве первая часть моего вопроса не сработала для вас?

3. Я попробовал первую часть. но это не работает. хорошо, я попробую еще раз

Ответ №2:

Используйте это, обратный вызов 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);
});     
  

Комментарии:

1. Я думаю, вы неправильно поняли вопрос. OP не реализует веб-сайт, а скорее пытается его автоматизировать. Сам веб-сайт использует Ajax. OP не имеет доступа к $.ajax веб-сайту.