Nunca use escape()
. No tiene nada que ver con la codificación HTML. Se parece más a la codificación de URL, pero ni siquiera es así. Es una codificación extraña no estándar disponible solo en JavaScript.
Si desea un codificador HTML, tendrá que escribirlo usted mismo ya que JavaScript no le proporciona uno. Por ejemplo:
function encodeHTML(s) {
return s.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}
Sin embargo, mientras que esto es suficiente para poner su user_id
en lugares como el input value
, no es suficiente para id
porque identificadores sólo pueden utilizar una selección limitada de caracteres. (Y %
no está entre ellos, por lo escape()
o incluso encodeURIComponent()
no es bueno.)
Se podía inventar su propio esquema de codificación para poner los caracteres en un documento de identidad, por ejemplo:
function encodeID(s) {
if (s==='') return '_';
return s.replace(/[^a-zA-Z0-9.-]/g, function(match) {
return '_'+match[0].charCodeAt(0).toString(16)+'_';
});
}
Pero Todavía tengo un problema si se produce el mismo user_id
dos veces. Y, para ser sincero, todo el asunto de tirar cadenas de HTML suele ser una mala idea. Utilice los métodos DOM en su lugar y conserve las referencias de JavaScript para cada elemento, de modo que no tenga que seguir llamando al getElementById
, o preocupándose acerca de cómo se insertan cadenas arbitrarias en los ID.
por ejemplo.:
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;
}
También es posible usar una función de conveniencia o marco JS para reducir la excesiva duración de la creación-set-anexa llamadas allí.
ETA:
estoy usando jQuery en este momento como un marco
OK, y luego considerar los accesos directos de creación de jQuery 1.4, por ejemplo .:
var log= $('<div>', {className: 'log'});
var input= $('<input>', {readOnly: true, val: user_id});
...
El problema que tengo ahora es que uso JSONP para agregar elementos y eventos a una página, por lo que no puedo saber si los elementos ya existir o no antes de mostrar un mensaje.
Puede mantener una búsqueda de user_id
a nodos de elemento (u objetos de envoltura) en JavaScript, para salvar a poner esa información en el propio DOM, donde los personajes que pueden ir en un id
se encuentran restringidas.
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);
}
(El prefijo _map_
se debe a que los objetos JavaScript No bastante trabajo como un mapeo de cadenas arbitrarias. La cadena vacía y, en IE, algunos Object
nombres de los miembros, lo confunden.)
¿Cuál es exactamente la función de 'id'? – Tgr
la identificación en este momento es cualquier cadena que representa un usuario.Lo uso para diferenciar estructuras similares de la página que pertenecen a diferentes usuarios. por esa lógica, MD5 o base64 podrían ser una buena espera para hacerlo, supongo. Simplemente no hay cosas integradas para eso. –