$(d).find('location#sydney')
è discutibile. #sydney
indica un elemento con un valore stimato sydney
con il tipo di schema ID
. In HTML, l'attributo id="..."
ha il tipo di schema ID
grazie a DOCTYPE. Ma questo file XML non ha DOCTYPE e quindi gli attributi id="..."
non hanno il tipo di schema ID
. Di conseguenza, getElementById('sydney')
non funzionerà e #sydney
come selettore non dovrebbe funzionare.
Funziona in pratica perché quando si utilizza find()
jQuery torna al proprio "Sizzle" selezionatore JavaScript Selector, che cerca semplicemente gli attributi id="..."
come se fosse HTML. Ma Sizzle è lento e non dovresti fare affidamento su questi dettagli di implementazione. L'utilizzo del selettore di attributo esplicito location[id=sydney]
è migliore per un documento XML.
var sydneyuv = sydneyuv += '<span>' + uvindex + '</span>' ;
Hai qui un incarico superfluo. Utilizzare l'assegnazione aumentata +=
per aggiungere qualcosa a sydneyuv
e quindi assegnare nuovamente il risultato a sydneyuv
.
Inoltre, in genere è meglio non unire insieme stringhe di HTML dai valori di input. Cosa fare se uvindex
contiene caratteri speciali HTML? (Probabilmente non lo farà, ma non c'è nulla che impedisca al sito che stai cercando di includerli.) Senza la funzione di escape dell'HTML potresti avere buchi di sicurezza in HTML-injection e potenzialmente XSS. Utilizza sempre metodi in stile DOM, come text()
e attr()
in jQuery, o la scorciatoia di creazione: var $sydneyuv= $('<span/>', {text: uvindex});
, preferibilmente a slittamento delle stringhe.
Speravo di poterlo semplificare in qualche modo.
Sicuro.Rendono su dati:
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.'}
];
ora che è possibile sostituire tutte quelle dichiarazioni separate con un ciclo:
$.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;
}
});
});
e presumibilmente simile per qualsiasi tempo uno sta facendo.
(userei l'ID piena città gli ID di documento HTML, quindi non è necessario il shorttown
mod.)
Sto vedendo un bel po 'di duplicazione, ma per quanto riguarda la qualità, direi che è abbastanza buono per qualcuno che sta imparando la lingua. – ChaosPandion
A * lotto * di ripetizione. Inoltre, hai sicuramente intenzione di imbatterti in restrizioni interdominio se hai intenzione di provare effettivamente a eseguire quel codice su qualsiasi sito web diverso dal sito che ti sta fornendo le informazioni –
Grazie! Sì, le funzioni sono praticamente le stesse tra le città, a parte il fatto che sono città "diverse" e richiedono diversi feed xml. Il dominio incrociato non è fortunatamente un problema, perché è per una webapp, pacchetto per iphone, quindi funzionerà da una directory locale. – Nelga