2009-08-18 3 views
1

J'ai un ensemble de liens générés dynamiquement dans une table. Chacune des lignes a une propriété "id" unique sur son tag. Le but est d'obtenir XMLHTTPRequest pour indiquer à la page 'deletepost.php' quel enregistrement retirer de la base de données externe.Comment puis-je publier une valeur via l'objet XMLHTTPRequest?

Il change une valeur d'entrée cachée à la valeur de la ligne (un numéro), et soumet ensuite ce formulaire

<script type="text/javascript"> 
     var http = false ; 

     // instance the request object!!!! 
     if(navigator.appName == "Microsoft Internet Explorer") { 
      http = new ActiveXObject("Microsoft.XMLHTTP"); 
     } else { 
      http = new XMLHttpRequest(); 
     } 
     ///////////////////////////////////////////////// 

     function rdel(num) { 
     document.getElementById("pid_to_del").value = num; 
     //this element is a hidden <input> tag. this line changes the value. 

     http.open("POST", "deletepost.php", true); //this _SHOULD_ post the form 
     http.onreadystatechange = function() { 

     if(http.readyState == 4) { 
      $("tr#r" + num).fadeOut("slow"); // jquery fadeout animation 
      alert(http.responseText); // this alerts whatever deletepost.php says 
     }  
     } 

     http.send(null); 
    } 


</script> 

Cette RDEL() de fonction est appelée par un des liens, qui ressemble à ceci :

<a href="javascript:rdel('7');"> delete </a> 

C'est ce que deletepost.php ressemble à:

<?php 
    print_r($_POST); 
?> 

la page qui fait la alertes sur demande:

multidisque ( )

un tableau vide. :(Pourquoi ?!

Répondre

1

Deux choses ici, le premier est donc que vous feriez que vous avez réellement mettre votre chaîne de poste (très similaire à une chaîne de requête) dans la

http.send(null); 

appel:

.
http.send('field1=value1') 

en second lieu, afin d'informer réellement le serveur qu'il ya des valeurs qui sont affichées, vous devez définir le type de contenu pour votre demande à l'aide:

http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 

Hope that helps

EDIT:

Je vois maintenant que vous essayez d'utiliser cette demande à envoyer une copie sérialisée d'un formulaire HTML sur le serveur de manière asynchrone. Javascript ne contient pas la fonctionnalité pour le faire, mais certaines bibliothèques et plugins (comme JQuery et AjaxForm) le font.

Pour votre exemple, cependant, vous devriez être en mesure d'y parvenir en utilisant:

http.send('pid_to_del=' + pid); 
1

Le plus rapide solution serait:

où vous ouvrez l'objet XMLHttpRequest: http.open("POST", "deletepost.php", true) changer l'URL être "deletepost.php? number =" + num

alors dans votre page php changez le POST en GET. Le POST vous permet d'envoyer de grandes quantités de paramètres/options, mais à moins que vos chiffres ne dépassent 140 caractères, cela ne fera aucune différence. Il semble y avoir une mauvaise conception commune que POST est plus sûr que GET, simplement parce qu'il semble plus évident comment obtenir un navigateur pour manipuler la variable de poste. Cependant, il est très difficile de faire la même chose avec les variables POST, donc la sécurité ne devrait pas dépendre de POSTing plutôt que de GETting. Il n'y a rien de mal à utiliser POST, sauf que vous ne semblez pas pouvoir le faire fonctionner facilement.Je ne ferais jamais cela directement en javascript. J'utiliserais toujours quelque chose comme jquery. Vous pouvez remplacer le script entier avec ce qui suit et il travailleriez dans la plupart des navigateurs:


function rdel(num) { 
    $.post("/webroot/deletepost.php", {number: num}, 
     function(dat){ 
      $("tr#r" + num).fadeOut("slow"); // jquery fadeout animation 
      alert(dat.responseText); // this alerts whatever deletepost.php 
    }); 
} 

par la manière, dans votre sélecteur $ (« tr # r » + num), le tr est inutile puisque les id sur une page est unique, donc le résultat sera le même que $ ('# r' + num), mais cela prendra plus de temps pour calculer le sélecteur. La référence par id est la plus rapide, la première trouve toutes les balises tr et trouve ensuite l'id dans cette collection, plutôt que d'utiliser la fonction getElementById 'native' en utilisant simplement id dans le sélecteur. En bref, ne faites pas de jquery faire ce dont vous n'avez pas besoin;)

Questions connexes