2016-10-11 4 views
1

dernièrement j'ai étudié le module de cauchemar je pense que c'est très simple et utile mais j'ai une question.comment utiliser rappel quand je clique sur ajax dans nightmarejs

comment utiliser le rappel automatique lorsque je clique sur le bouton ajax

de 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); 
}); 

il y a la méthode attendre. la plupart des gens utilisent wait methed J'ai recherché googling

.wait(1000) 

Je n'utilise pas la méthode wait. parce que si le réseau est déconnecté ou lent. Ce n'est pas bon code

Pourriez-vous m'aider méthode de rappel ??

Merci. Donc, j'ai motifier le code, mais ça ne fonctionne pas

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); 
}); 

Répondre

0

Il existe plusieurs façons de résoudre ce problème. Le plus simple serait le suivant. Supposons qu'une requête Ajax se termine, elle change toujours quelque chose sur la page.

La plupart de ces changements peuvent être facilement détectés en attendant l'apparition d'éléments spécifiques pouvant être appariés par des sélecteurs CSS. Imaginons que vous cliquiez sur quelque chose et que le résultat soit écrit dans l'élément correspondant à "#result". S'il n'y avait pas un tel élément avant le clic, vous pouvez attendre jusqu'à ce que l'existence de cet élément:

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

Vous pouvez également utiliser des sélecteurs CSS pour compter les choses. Par exemple, disons qu'il y a dix éléments qui peuvent être associés à "#result > a". Si un clic ajoute 10 plus, vous pouvez attendre le 20 en utilisant:

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

Le monde des sélecteurs CSS est assez grand.


Bien sûr, vous pouvez utiliser evaluate pour ajouter un gestionnaire d'événements général Ajax comme $(document).ajaxSuccess(fn) pour être informé chaque fois qu'un rappel terminé, mais le code source d'une page change tout le temps. Il serait plus facile de maintenir votre code si vous recherchez les résultats visibles dans le DOM.

+0

vous remercie pour votre réponse. Ça ne marche pas. pourriez-vous vérifier mon code? J'ai motivé ma question. C'est très difficile. –

+0

Pourquoi utilisez-vous ajaxSuccess? La première partie de ma question n'a-t-elle pas fonctionné pour vous? –

+0

J'ai essayé la première partie. mais ça ne marche pas. ok je vais essayer à nouveau –

-1

Utilisez ce, rappel 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); 
});  
+0

Je pense que vous avez mal compris la question. OP ne met pas en œuvre le site Web, mais essaie plutôt de l'automatiser. Le site lui-même utilise Ajax. OP n'a pas accès à '$ .ajax' du site. –