2010-01-18 3 views
0

Matin tout,un symbole href firefox n provoque setter ne pas appeler

tôt lundi matin et je me bats pour comprendre pourquoi la ligne followng fonctionne dans IE et non pas dans FF.

<a class="button" href="#" onclick="setMaintenanceMode(false);">disable</a> 

Dans les deux IE et FF l'URL lorsque vous passez la souris sur le bouton est ...

http://localhost:8080/mainapp/secure/gotoDevice.action?hardwareId=1&storeCode=2571# 

Lorsque le bouton est cliqué, la méthode suivante est appelée ...

function setMaintenanceMode(enabled) { 
    var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled; 
    document.location.href = url; 
} 

L'URL docuement est envoyée est (dans les deux navigateurs) ...

/mainapp/secure/gotoDevice.action?hardwareId=1&amp;storeCode=2571&ModeEnabled=false 

Le problème est que dans IE la méthode sur l'action struts 'setSetCode()' est appelée, mais à partir de FF elle n'est pas! Si je supprime le hash ahref ci-dessus FF fonctionne, mais IE ne fonctionne pas (href = "#").

J'ai essayé de changer le '&ModeEnabled=' en '&amp;ModeEnabled=', mais sans succès. J'ai regardé google et le forum Struts, mais pas de succès. Je suis tenté d'arracher tous les ahref et de les remplacer par des Dojo et de voir si cela fonctionne, mais avant je le fais, je me demandais si quelqu'un pouvait expliquer pourquoi. Je pense que ahref est la mauvaise chose à utiliser, mais pourquoi?

Si quelqu'un pouvait m'aider à comprendre pourquoi bien que ce serait apprécié.

Merci Jeff Porter

EDIT: La fausse déclaration fait partie de la solution. Le problème semble être que l'url ..

/mainApp/secure/setMaintenanceMode.action?hardwareId=5&amp;storeCode=2571&ModeEnabled=true 

a le &amp; à l'intérieur, si je vais à cette URL comme il est, il fonctionne dans IE, mais pas dans FF.

si je change les deux pour être & alors cela fonctionne dans IE & FF.

si je change les deux pour être &amp; alors il fonctionne toujours dans IE mais pas FF.

Des idées?

Note:

Il semble que pavane 2.0.9 ne supporte pas la propriété escapeAmp sur l'étiquette <s:url:

Par paramètres de la requête par défaut seront séparés en utilisant esperluette (échappées à savoir &amp;). Cela est toutefois nécessaire pour la conformité XHTML, lorsque vous utilisez l'URL générée par cette balise avec la balise <s:property>, l'attribut escapeAmp doit être utilisé pour désactiver l'esperluette et l'échappement.

soultion: return false sur le onclick et passer à de nouvelles entretoises + set escapeAmp param. sinon, url = url.replace("&amp;", "&");.

Répondre

2

essayer de retourner faux de la méthode javascript

function setMaintenanceMode(enabled) { 
    var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled; 
    document.location.href = url; 
    return false; 
} 

<a class="button" href="#" onclick="return setMaintenanceMode(false);">disable</a> 

Cela devrait arrêter le javascript événement onclick pour atteindre le navigateur.

+1

Non, sauf si vous 'setMaintenanceMode de retour (...' – Anonymous

2

onclick="setMaintenanceMode(false); return false;"

Le onclick fonctionne, mais le href immédiatement ne, aussi bien. Vous devez renvoyer false à partir du gestionnaire de clics pour signaler que href ne doit pas être suivi.

IE probablement devine ce que vous voulez dire, et fait la mauvaise chose.

+0

Je pense que vous êtes à la fois correct, mais ce n'est pas la solution complète. S'il vous plaît voir mes nouveaux commentaires dans la question. –

+0

Si l'esperluette apparaît dans votre HTML, il doit apparaître en tant qu'entité HTML S'il est dans un fichier séparé chargé avec le script src = "", il ne devrait pas être ainsi échappé Je pense qu'il y a un cas intermédiaire entre XHTML et les blocs CDATA, mais – Anonymous

+0

Vous pouvez également essayer d'utiliser un caractère différent de celui de l'esperluette pour séparer les champs de la chaîne de requête. Le point-virgule (;) est un secon commun d choix. La plupart des grandes applications Web génériques comprennent ce que cela signifie, parce que c'est dans la RFC (voir http://en.wikipedia.org/wiki/Query_string#Structure et les références qui s'y trouvent) – Anonymous

0

l'URL a le &amp; à l'intérieur, si je vais à cet URL tel qu'il est, alors cela fonctionne dans IE, mais pas dans FF. Je doute de cela - cela ne devrait pas fonctionner dans l'un ou dans l'autre. Ce n'est pas dépendant du navigateur mais du serveur.

La chaîne a=b&amp;c=d est divisée en paramètres par l'infrastructure de serveur. Servlet nécessite que seulement & être utilisé pour séparer les paramètres, de sorte qu'il renverra a = b et amp;c = d. Ce dernier paramètre ne sera évidemment pas reconnu par l'application qui attend c.

La spécification HTML pour diverses raisons recommande fortement ; également être autorisés comme séparateur, auquel cas vous obtiendrez a=b, un amp parasite qui, sans un signe égal serait dénué de sens et mis au rebut, et c=d. Donc, malgré le mauvais encodage de l'esperluette, cela fonctionnerait toujours. Malheureusement, Servlet ignore cette recommandation. Par défaut, les paramètres de demande seront séparés en utilisant des esperluettes échappées (c'est-à-dire &amp;).

Oh mon dieu! Quel malheur. Vous ne devriez pas échapper les esperluettes au moment de joindre les paramètres dans une URL. Vous devez simplement joindre les paramètres avec une seule perluète, et puis, si vous avez besoin de mettre l'URL finie dans une valeur d'attribut de contenu textuel, encoder en HTML l'URL entière. Le comportement par défaut de Struts est simplement faux ici.

Dans votre cas, vous n'êtes pas exportez l'URL à une valeur d'attribut ou le contenu du texte, vous écrivez dans une chaîne littérale dans un bloc de script:

var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled; 

Dans un bloc de script dans l'ancienne école HTML, l'échappement HTML ne s'applique pas. (En XHTML en XML natif c'est le cas, mais n'y pensons pas encore.)

Cependant, vous devez toujours penser aux évasions JavaScript. Par exemple, que se passe-t-il s'il existe une apostrophe dans le lien setMaintenanceMode? Cela casserait la chaîne.Ou si vous aviez une séquence </ dans la chaîne, cela casserait le bloc de script entier. Ce que vous voulez vraiment faire est de faire l'URL (sans échappant à l'esperluette), puis d'utiliser une chaîne de caractères JavaScript littéralement backslash-escape. Le mieux serait d'utiliser un codeur JSON existant qui convertira toute valeur Java en un littéral JavaScript, en plaçant les guillemets environnants pour vous aussi s'il s'agit d'une chaîne. Vous pouvez aussi, sur la plupart des encodeurs JSON, le signaler à JS: échapper les caractères < et &, ce qui signifie que vous n'avez pas à vous soucier de l'analyse XHTML si vous décidez de servir la page en XML dans le futur.

Je suis tenté de déchirer toutes les ahref de les remplacer par des boutons

Bien sûr si vous avez une chose que vous cliquez sur c'est pas un lien vers un autre emplacement, mais simplement le fait quelque chose à la page via script, alors ce n'est pas vraiment un lien, et vous feriez mieux de le marquer comme <button> ou <input type="button">, et en utilisant CSS pour le relooker pour ne pas ressembler à un bouton si vous ne le voulez pas à.

Cependant (encore), tout cela semble plutôt inutile, car au moment où vous remplacez le comportement d'un lien avec un comportement qui, tout comme un lien n'est pas aussi flexible. Quel est le problème avec simplement:?

<a href="/mainApp/secure/setMaintenanceMode.action?hardwareId=5&amp;storeCode=2571&amp;ModeEnabled=false">disable</a> 
Questions connexes