Comment puis-je adresser des requêtes à d’autres serveurs (c’est-à-dire obtenir une page de n’importe quel serveur de votre choix) avec un JavaScript dans le navigateur de l’utilisateur? Il existe des limitations pour empêcher cela avec des méthodes telles que XMLHttpRequest. Existe-t-il des moyens de les contourner ou d’autres méthodes?
C’est une question générale. En particulier, je souhaite vérifier une série de sites Web aléatoires et voir s’ils contiennent un élément donné. J'ai donc besoin du contenu HTML d’un site Web sans télécharger de fichiers supplémentaires; tout cela dans un fichier JavaScript, sans aucun mécanisme de transfert ou de proxy sur un serveur .
(Remarque: une solution consiste à utiliser Greasemonkey et son GM_xmlhttpRequest.)
Vous devriez vérifier jQuery . Il a une riche base de AJAX fonctionnalités qui peuvent vous donner le pouvoir de faire tout cela. Vous pouvez charger une page externe et analyser son contenu HTML avec des sélecteurs intuitifs de type CSS .
Un exemple utilisant $ .get ();
$.get("anotherPage.html", {}, function(results){
alert(results); // will show the HTML from anotherPage.html
alert($(results).find("div.scores").html()); // show "scores" div in results
});
Pour les domaines externes, j'ai dû créer un script local PHP qui agira comme intermédiaire. jQuery appellera le script local PHP en passant en argument l'URL d'un autre serveur, le script local PHP recueillera les données et jQuery lira les données du système local PHP script.
$.get("middleman.php", {"site":"http://www.google.com"}, function(results){
alert(results); // middleman gives Google's HTML to jQuery
});
Donner à quelque chose d'intermédiaire.php dans le sens de
<?php
// Do not use as-is, this is only an example.
// $_GET["site"] set by jQuery as "http://www.google.com"
print file_get_contents($_GET["site"]);
?>
Écrivez un script proxy qui transfère la requête http de votre domaine, ce qui contournera les restrictions XMLHttpRequest.
Si vous utilisez PHP, utilisez simplement cURL pour demander et lire la page, puis crachez simplement le code HTML comme s'il provenait de votre domaine.
C'est plutôt facile ... si vous connaissez le truc "secret", presque personne ne le partage ...
C'est ce qu'on appelle Yahoo yql ...
Donc, pour regagner le "pouvoir de l'utilisateur" (et pour revenir à la devise pratique: "ne jamais accepter non"), utilisez simplement http://query.yahooapis.com/ (au lieu d'un serveur proxy php? scénario).
jQuery ne serait pas strictement nécessaire.
EXEMPLE 1:
En utilisant la commande semblable à SQL:
select * from html
where url="http://stackoverflow.com"
and xpath='//div/h3/a'
Le lien suivant effacera SO pour les questions les plus récentes (en contournant la bulle de sécurité inter-domaines $ #! 7):
http://query.yahooapis.com/v1/public/yql?q=select%20title%20from%20html%20where%20url%3D%22http%3A%2F%2Fstackoverflow.com%22 % 20et% 0A% 20% 20% 20% 20% 20% 20xpath% 3D% 27% 2F% 2Fdiv% 2Fh3% 2Fa% 27% 0A% 20% 20% 20% 20 & format = json & callback = cbfunc
Comme vous pouvez le voir, cela retournera un tableau JSON (on peut aussi choisir xml) et appelle la fonction de rappel: cbfunc
.
En effet, en tant que "bonus", vous sauvegardez également vous enregistrez un chaton à chaque fois que vous n’avez pas besoin de donner une expression rationnelle à des données provenant de "tag-soup".
Entendez-vous votre petit scientifique fou en vous commencer à rire?
Puis voir cette réponse pour plus d’informations (et n'oubliez pas ses commentaires pour plus d'exemples).
Bonne chance!
mise à jour 2018:
Vous ne pouvez accéder à interdomaine qu'avec les 4 conditions suivantes
Access-Control-Allow-Origin: *
Démo
$.ajax({
url: 'https://api.myjson.com/bins/bq6eu',
success: function(response){
console.log(response.string);
},
error: function(response){
console.log('server error');
}
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Démo:
$.ajax({
url: 'https://cors-anywhere.herokuapp.com/http://whatismyip.akamai.com/',
success: function(response){
console.log('server IP: ' + response);
},
error: function(response){
console.log('bridge server error');
}
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Allow-Control-Allow-Origin: *
Chrome
chrome.exe --args --disable-web-security
Firefox
about:config -> security.fileuri.strict_Origin_policy -> false
fin
noob old answer 2011
$ .get (); peut obtenir des données de jsbin.com mais je ne sais pas pourquoi il ne peut pas obtenir de données d'un autre site comme google.com
$.get('http://jsbin.com/ufotu5', {},
function(results){ alert(results);
});
démo: http://jsfiddle.net/Xj234/ testé avec firefox, chrome et safari.
<script language = "JavaScript" type = "text/javascript" src = "http://www.example.com/hello.js"> </ script>
Vous ajoutez les données dans hello.js sous forme de tableau, JSON ou similaire. Exemple: Var daysInMonth = nouveau tableau (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
Obtenir du code JavaScript depuis un autre serveur n'est pas si simple .. :-)
Pour ce faire, vous devrez écrire un proxy sur le serveur. Et toutes les demandes seront adressées à votre serveur, qui le chargera et le renverra au client. Et il n'y a pas de bon moyen pour implémenter cela via JavaScript uniquement.
jQuery contient une fonctionnalité permettant de charger des données JSON ou des scripts externes à l'aide de XmlHttpRequest, mais cette fonctionnalité ne peut pas être utilisée pour les pages HTML. Vous pouvez également consulter ce fil de la liste de diffusion jQuery.
Merci beaucoup, c'est vraiment un bon truc. J'ai fait de cette façon:
test.html
<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc()
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","sp.php",true);
xmlhttp.send();
}
</script>
</head>
<body>
<h2>Using the XMLHttpRequest object</h2>
<div id="myDiv"></div>
<button type="button" onclick="loadXMLDoc()">Change Content</button>
</body>
</html>
sp.php
<?php
print file_get_contents("http://your.url.com/you-can-use-cross-domain");
?>
Vous pouvez également utiliser un iframe pour émuler une demande ajax. Cela vous évite d'avoir à coder une solution dorsale pour un problème frontal. Voici un exemple:
function setUploadEvent(typeComponet){
var eventType = "";
var iframe = document.getElementById("iframeId");
try{
/* for Mozilla / Opera9 */
if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent)) {
eventType = "onload";
}else{
/* IE */
eventType = "onreadystatechange";
}
iframe[eventType] = function(){
var doc = iframe.contentDocument || iframe.contentWindow.document;
var response = doc.body.innerHTML; /* or what ever content you are looking for */
}
}
catch(e){
alert("Error loading content")}
}
Cela devrait faire l'affaire. Veuillez noter que la ligne de détection du navigateur n'est pas la plus propre. Vous devez absolument utiliser celles fournies dans tous les frameworks JS les plus courants (Prototype, JQuery, etc.).