web-dev-qa-db-fra.com

POST à partir d'une balise <A>

Est-il possible de faire un POST à partir d'une balise <a>? Je sais que les balises d'ancrage sont généralement réservées aux GET, et je sais que je peux utiliser javascript pour faire cela (comme dans demande de publication JavaScript comme un formulaire de soumission ), mais cela me semble un peu désordonné. Y a-t-il un moyen de faire cela avec du HTML droit?

37
Carrotman42

Il n’existe aucun moyen de POST un élément a en utilisant uniquement HTML.

Comme on peut le voir dans ce fragment de DTD ( Spécification HTML 4.01 ):

<!ELEMENT A - - (%inline;)* -(A)       -- anchor -->
<!ATTLIST A
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
  type        %ContentType;  #IMPLIED  -- advisory content type --
  name        CDATA          #IMPLIED  -- named link end --
  href        %URI;          #IMPLIED  -- URI for linked resource --
  hreflang    %LanguageCode; #IMPLIED  -- language code --
  rel         %LinkTypes;    #IMPLIED  -- forward link types --
  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
  accesskey   %Character;    #IMPLIED  -- accessibility key character --
  shape       %Shape;        rect      -- for use with client-side image maps --
  coords      %Coords;       #IMPLIED  -- for use with client-side image maps --
  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
  onfocus     %Script;       #IMPLIED  -- the element got the focus --
  onblur      %Script;       #IMPLIED  -- the element lost the focus --
  >

Il n'y a pas d'attribut qui contrôle s'il faut utiliser POST ou GET avec un élément a.

Vous devez pour le script, si vous voulez abuser de la sémantique.

25
Oded

Non, pas vraiment. Vous pouvez cependant faire quelque chose comme ceci:

<form action="theUrl" method="POST">

<input type="hidden" name="param1" value="val" />
<input type="hidden" name="param2" value="val2" />

<a href="#" onclick="this.parentNode.submit()">Go to that link!</a>

</form>

Vous devriez trouver un meilleur moyen, cependant. Celui-ci ne se dégrade pas avec grâce.

30
Ry-

Vous pouvez utiliser CSS pour que <input type="submit"> ressemble à un lien hypertexte.

9
SLaks

Si cela sert à quelqu'un: 

<a href="/your-route"
    onclick="event.preventDefault();
    document.getElementById('magic-form').submit();">
    Magic Action
</a>
<form id="magic-form" action="/your-route" 
      method="POST" style="display: none;">
      {{ csrf_field() }} <!-- from your framework -->
      <input type="hidden" name="field1" value="value1" />
      <!-- other fields -->
</form>
2
nasatome

Réponse simple: non. Vous devez utiliser javascript pour faire ce genre de chose; depuis quand vous faites un POST, vous envoyez les données de la requête HTTP. Avec get, vous l'envoyez simplement dans le cadre de la chaîne (vous pouvez donc le faire avec la valeur href).

2
MarioRicalde

Non clairement pas sans un javascript submit ().

1
VGE

Non, il n'y a aucun moyen de faire cela sans l'utilisation de scripts. Bien que vous puissiez utiliser CSS pour créer un style pour un bouton standard Soumettre, il ressemblera plus à une balise.

1
Dan

Vous devriez ajouter data-method = "post"

Par exemple: <a href="/some-link" data-method="post">Logout</a>

0
Iryna Batvina

Les deux manières auxquelles je pense sont avec JavaScript (comme vous l'avez dit) ou via serveur-scription.

En gros, vous enverriez la demande GET (avec le A) à un fichier serveur, ce qui changerait les vars GET en POST, puis le soumettrait immédiatement (emplacement de la redirection). Mais cela ferait foirer les statistiques du référent, je pense.

0
ecchymose