#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
веб-сайту.