2017-10-10 1 views
0

natif J'ai le code suivant:jQuery fonctionne ajax mais JS ajax

Contrôleur

def some_method 
respond_to do |format| 
    format.js { render js: "alert();" } 
end 
end 

JS

Cette alerte exécute();

jQuery.ajax({ 
url: url 
}); 

Ceci n'exécute pas alert();

var xhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); 
xhttp.open("GET", url, true); 
xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
xhttp.send(); 

Qu'est-ce qui est si différent dans jQuery que dans JavaScript?

Remarque:

1> Les deux demandes feu l'AJAX. Mais, seule la requête jQuery exécute le code JS, mais pas JS AJAX natif.

2> J'ai déjà comparé, Demande et Réponse en-têtes pour les deux types de demandes. Mais, je ne trouve aucune différence.

+0

Quelle version de jQuery utilisez-vous? – Walk

+0

@Walk 1.8.3. Mais, comment cela compte-t-il? – Abhi

+0

Je crois que c'est un bogue dans jQuery 1.x et 2.x, il ne devrait pas être exécuté immédiatement dans 3.x. Vérifiez cette page https://github.com/jquery/jquery/issues/2432 Je suppose que vous devrez «eval' résultat pour atteindre la même fonctionnalité. – Walk

Répondre

0

Ok, j'ai trouvé la réponse. J'ai creusé à l'intérieur jQuery.ajax code et a constaté que jQuery.ajax exécute également fait dans son code qui évalue la réponse. Ainsi, dans JS natif, nous pouvons évaluer la réponse, comme:

var xhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); 

xhttp.open("GET", url, true); 
xhttp.onreadystatechange = function() { 
    if (xhttp.readyState > 3 && xhttp.status == 200) { 
     eval(xhttp.responseText); // This line does the trick 
    } 
    }; 
xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
xhttp.send();