$(d).find('location#sydney')
es cuestionable. #sydney
significa un elemento con un atributo con valor de sydney
que tiene el tipo de esquema ID
. En HTML, el atributo id="..."
tiene el tipo de esquema ID
gracias al DOCTYPE. Pero este archivo XML no tiene DOCTYPE y, por lo tanto, sus atributos id="..."
no tienen el tipo de esquema ID
. En consecuencia, getElementById('sydney')
no funcionará, y #sydney
como selector no debería funcionar.
Funciona en la práctica porque cuando usa find()
jQuery vuelve a su propio selector de JavaScript "Sizzle" JavaScript, que simplemente busca los atributos id="..."
como si fuera HTML. Pero Sizzle es lento y no deberías confiar en este detalle de implementación. Usar el selector de atributo explícito location[id=sydney]
es mejor para un documento XML.
var sydneyuv = sydneyuv += '<span>' + uvindex + '</span>' ;
Tiene una tarea superflua aquí. Utiliza la asignación aumentada +=
para agregar algo a sydneyuv
, y luego asigna el resultado al sydneyuv
nuevamente.
Además, generalmente es mejor no unir cadenas de HTML a partir de valores de entrada. ¿Qué pasa si uvindex
tiene caracteres HTML especiales? (Probablemente no sea así, pero no hay nada que impida que el sitio que estás utilizando incluya). Sin el escape de HTML, tendrías inyecciones de HTML y posiblemente agujeros de seguridad XSS. Utilice siempre métodos de estilo DOM, como text()
y attr()
en jQuery, o el atajo de creación: var $sydneyuv= $('<span/>', {text: uvindex});
, con preferencia al sling de cadena.
Esperaba poder simplificar esto de alguna manera.
Sure.Que sea impulsado por los datos:
var towns= ['sydney', 'melbourne', 'brisbane', 'perth', 'adelaide', 'darwin'];
var uvlevels= [
{uvlevel: 2, risk: 'Low', curcon: 'You can safely stay outdoors and use an SPF 15 moisturiser.'},
{uvlevel: 5, risk: 'Moderate', curcon: 'Wear protective clothing outdoors and use an SPF 15 or SPF 30 moisturiser.'},
{uvlevel: 7, risk: 'High', curcon: 'Wear protective clothing, limit your time outdoors and use an SPF 30 moisturiser.'},
{uvlevel: 10, risk: 'Very high', curcon: 'Use caution, limit exposure to the sun and use an SPF 30 moisturiser.'},
{uvlevel: 20, risk: 'Extreme', curcon: 'Use extreme caution, avoid exposure to the sun and use an SPF 30 moisturiser.'},
{uvlevel: null, risk: 'Unavailable', curcon: 'Information is currently unavailable.'}
];
ya se puede sustituir todos esos estados separados con un bucle:
$.each(towns, function() {
var $location= $(d).find('location[id='+this+']');
var uv= $location.find('index').text();
var shorttown= this.slice(0, 3);
$('#uv-'+shortttown).empty().append($('<span/>', {text: uv}));
$.each(uvlevels, function() {
if (this.uvlevel===null || uv<=this.uvlevel) {
$('#risk-'+shorttown).text(this.risk);
$('#curcon-'+shorttown).text(this.curcon);
return false;
}
});
});
y presumiblemente similar para que sea de un tiempo haciendo.
(que haría uso de la Identificación plena ciudad en los ID de documento HTML, por lo que no es necesario el hack shorttown
.)
Estoy viendo un poco de duplicación, pero en cuanto a calidad, diría que es bastante buena para alguien que acaba de aprender el idioma. – ChaosPandion
A * lote * de repetición. Además, definitivamente te toparás con restricciones de dominios cruzados si vas a intentar ejecutar ese código en cualquier sitio web que no sea el que te proporciona la información –
¡Gracias! Sí, las funciones son básicamente las mismas entre ciudades, aparte del hecho de que son ciudades "diferentes" y requieren diferentes alimentaciones xml. El dominio cruzado afortunadamente no es un problema porque es para una aplicación web empaquetada para iPhone, por lo que estará funcionando desde un directorio local. – Nelga