Mai utilizzare escape()
. Non ha nulla a che fare con la codifica HTML. È più come la codifica dell'URL, ma non è nemmeno proprio così. È una bizzarra codifica non standard disponibile solo in JavaScript.
Se si desidera un codificatore HTML, è necessario scriverlo manualmente poiché JavaScript non ne fornisce uno. Per esempio:
function encodeHTML(s) {
return s.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}
Tuttavia, mentre questo è sufficiente per mettere il vostro user_id
in luoghi come il input value
, non è abbastanza per id
perché gli ID possono utilizzare solo una selezione limitata di caratteri. (E %
non è tra questi, in modo escape()
o addirittura encodeURIComponent()
non va bene.)
Si potrebbe inventare il proprio schema di codifica per mettere tutti i caratteri in un ID, ad esempio:
function encodeID(s) {
if (s==='') return '_';
return s.replace(/[^a-zA-Z0-9.-]/g, function(match) {
return '_'+match[0].charCodeAt(0).toString(16)+'_';
});
}
Ma voi hai ancora un problema se lo stesso user_id
si verifica due volte. E ad essere onesti, l'intera cosa con il lancio di stringhe HTML è di solito una cattiva idea. Utilizza invece i metodi DOM e mantieni i riferimenti JavaScript per ogni elemento, quindi non devi continuare a chiamare getElementById
o preoccuparti di come le stringhe arbitrarie vengono inserite negli ID.
es.:
function addChut(user_id) {
var log= document.createElement('div');
log.className= 'log';
var textarea= document.createElement('textarea');
var input= document.createElement('input');
input.value= user_id;
input.readonly= True;
var button= document.createElement('input');
button.type= 'button';
button.value= 'Message';
var chut= document.createElement('div');
chut.className= 'chut';
chut.appendChild(log);
chut.appendChild(textarea);
chut.appendChild(input);
chut.appendChild(button);
document.getElementById('chuts').appendChild(chut);
button.onclick= function() {
alert('Send '+textarea.value+' to '+user_id);
};
return chut;
}
Si potrebbe anche usare una funzione di convenienza o framework JS per ridurre il lungaggini del create-set-aggiunge chiamate lì.
ETA:
sto usando jQuery al momento come un quadro
OK, quindi prendere in considerazione i collegamenti di creazione di jQuery 1.4, ad es .:
var log= $('<div>', {className: 'log'});
var input= $('<input>', {readOnly: true, val: user_id});
...
Il problema che ho adesso è che uso JSONP per aggiungere elementi ed eventi a una pagina, quindi non posso sapere se gli elementi già esistere o meno prima di mostrare un messaggio.
È possibile mantenere una ricerca di user_id
di nodi elemento (o oggetti wrapper) in JavaScript, per salvare mettendo tali informazioni nel DOM per sé, in cui i personaggi che possono andare in un id
sono limitati.
var chut_lookup= {};
...
function getChut(user_id) {
var key= '_map_'+user_id;
if (key in chut_lookup)
return chut_lookup[key];
return chut_lookup[key]= addChut(user_id);
}
(Il prefisso _map_
è perché gli oggetti JavaScript Non abbastanza lavoro di mappatura delle stringhe arbitrarie. La stringa vuota e, in IE, alcuni nomi dei membri Object
, confondono.)
Che cosa è esattamente la funzione di 'id'? – Tgr
l'ID adesso è qualsiasi stringa che rappresenta un utente.Lo uso per differenziare strutture simili della pagina che appartengono a utenti diversi. da quella logica, MD5 o base64 potrebbe essere una buona attesa per farlo, credo. Non ci sono cose incorporate per questo. –