C'est donc bien un problème de guillemets. Regardons ton instruction return :
return "<a href='javascript:" + customFunction + "(" + rowId + ")'>" + cellValue + "</a>";
Il y a plusieurs niveaux de complexité dans cette instruction car elle construit un bout de code HTML qui contient lui-même du code JavaScript. Je déconseille ce genre de pratique car, justement, elle conduit facilement à l'oubli de guillemets !
Dans ton code, il se passe en gros la même chose que si tu appellais eval : tu fais interpréter une chaîne en tant que code JavaScript. Tu as donc la variable customFunction qui contient la chaîne "deleteArticle", suivie de la chaîne "(" suivie de la variable rowId suivie de ")". Alors, si rowId contient la chaîne "83082EG", tu te retrouves avec un code équivalent à :
"deleteArticle" + "(" + "83082EG" + ")"
Une fois tout concaténé, cela donne la chaîne "deleteArticle(83082EG)" et c'est bien ce que tu vois dans ta console.
À présent je pense que l'absence de guillemets autour de 83082EG te saute aux yeux ; au moment où cette chaîne est interprétée comme du code JavaScript, l'interpréteur voit quelque chose qui commence par un nombre avec un E derrière, essaye de l'interpréter en tant que notation scientifique, et échoue.
Comme première solution rapide, plus un « patch d'urgence » qu'une vraie solution, je te propose de rajouter les guillemets manquants.
1 2
| return "<a href='javascript:" + customFunction + "(\"" + rowId + "\")'>" + cellValue + "</a>";
// ---------------------------------------------là-^--------et là-^ |
Tu seras d'accord avec moi : ça ne rend pas le code très facile à saisir au premier coup d’œil. Que tu choisisses le guillemet simple ' ou double ", tu es obligé de l'échapper car il est déjà utilisé pour délimiter soit la chaîne, soit l'attribut href.
Note importante : les liens commençant par javascript: sont dépréciés. Au fil des années, avec le passage à XHTML puis HTML5, la sémantique du <a> a évolué, a été rendue plus stricte ; il a été décidé qu'un lien devrait servir uniquement à pointer vers des ressources distantes, et pas à servir de simple déclencheur de script, rôle qui est attribué aux boutons.
Comme solution plus solide, je te propose donc de construire un bouton, avec la méthode du DOM, ce qui te permet d'éviter de « monter » dans les niveaux de complexité.
1 2 3 4 5 6 7 8 9 10 11 12 13
| function showlinkajax (cellValue, options, rowdata) {
var customFunction = options.colModel.formatoptions.function;
var rowId = options.rowId;
var $button = document.createElement("button");
$button.innerHTML = cellValue;
$button.title = "Supprimer cette ligne"; // (1)
$button.onclick = function() {
window[customFunction](rowId); // (2)
};
return $button; // (3)
} |
En (1), c'est un bonus : un attribut title qui affiche une infobulle au survol. Ça marche aussi avec les liens. En fait, ça marche avec la plupart des éléments HTML. Ça ne coûte pas grand chose, c'est universel et ça ajoute de l'ergonomie.
Il se passe une chose bizarre ici en (2) : c'est quoi ce mélange de crochets et de parenthèses ?
La variable customFunction est une chaîne, or je veux appeler une fonction. Je ne me suis pas donné le droit de tricher avec un eval ; en revanche je sais que la fonction existe au niveau global, autrement dit sur l'objet window. Je vais donc utiliser la syntaxe des crochets.
En effet, window["deleteArticle"] est équivalent à window.deleteArticle.
Du coup, en appelant window[customFunction](rowId), c'est comme si j'appelais window.deleteArticle(rowId).
Pour (3), attention : j'ai modifié le type de retour de ta fonction pour lui permettre de renvoyer une référence directe sur le bouton. Faute de quoi, si tu essayes de récupérer le code HTML du bouton (c'est possible, par exemple avec outerHTML), il est en réalité copié, et le onclick qui y était attaché est perdu.
À l'endroit où tu appelles ta fonction showlinkajax, tu reçois non plus un bout de code HTML mais un élément DOM. Tu peux donc utiliser une méthode du DOM (appendChild, insertAdjacentHTML ou autre) pour l'insérer dans la structure de la page. Exemple :
1 2
| var $button42 = showlinkajax(...);
document.getElementById("cell42").appendChild($button42); |
(en supposant que tu as un élément #cell42 dans ta page.)
Dernière remarque : évidemment, un <button> n'a pas la même apparence qu'un lien. Pas de soucis, ça se règle en 4 lignes de CSS 
1 2 3 4
| button { border: none;
background: none;
padding: 0;
cursor: pointer; } |
Partager