$(d).find('location#sydney')
ist fraglich. #sydney
bedeutet ein Element mit einem Attribut sydney
, das den Schematyp ID
hat. In HTML hat das id="..."
Attribut den Schematyp ID
dank dem DOCTYPE. Diese XML-Datei hat jedoch keinen DOCTYPE und daher haben die id="..."
Attribute keinen Schematyp ID
. Folglich getElementById('sydney')
wird nicht funktionieren, und #sydney
als Selektor sollte nicht funktionieren.
Es funktioniert in der Praxis, denn wenn Sie find()
verwenden, greift jQuery auf seinen eigenen "Sizzle" JavaScript-Selektor Matcher zurück, der einfach nach id="..."
Attributen sucht, als ob es HTML wäre. Aber Sizzle ist langsam und Sie sollten sich nicht auf dieses Implementierungsdetail verlassen. Die Verwendung des expliziten Attributselektors location[id=sydney]
ist besser für ein XML-Dokument.
var sydneyuv = sydneyuv += '<span>' + uvindex + '</span>' ;
Sie haben hier eine überflüssige Aufgabe. Verwenden Sie die erweiterte Zuordnung +=
, um etwas zu sydneyuv
hinzuzufügen, und weisen Sie das Ergebnis erneut sydneyuv
zu.
Außerdem ist es im Allgemeinen am besten, keine HTML-Strings aus Eingabewerten zusammenzufassen. Was passiert, wenn uvindex
HTML-Sonderzeichen enthält? (Es wird wahrscheinlich nicht, aber es gibt nichts, das die Seite stoppt, die Sie davon abkratzen, sie einzuschließen.) Ohne HTML-Entweichen Sie würden HTML-Einspritzung und möglicherweise XSS Sicherheitslöcher haben. Verwenden Sie immer DOM-style-Methoden, wie text()
und attr()
in jQuery, oder die Erstellungsverknüpfung: var $sydneyuv= $('<span/>', {text: uvindex});
anstelle von String-Schlingen.
Ich hatte gehofft, ich könnte das irgendwie vereinfachen.
Sicher.Machen Sie es datengetriebener:
$.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;
}
});
});
und vermutlich ähnlich für was auch immer das Wetter jemandes tun:
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.'}
];
Jetzt haben Sie alle diese unterschiedlichen Aussagen mit einer Schleife ersetzen.
(ich die volle Stadt ID in dem HTML-Dokument-IDs verwenden würde, so dass Sie den shorttown
Hack nicht brauchen.)
Ich sehe einiges an Duplizierung, aber qualitativ würde ich sagen, dass es ziemlich gut für jemanden ist, der nur die Sprache lernt. – ChaosPandion
A * Menge * Wiederholung. Außerdem werden Sie definitiv in domänenübergreifende Beschränkungen stoßen, wenn Sie tatsächlich versuchen, diesen Code auf einer anderen Website als der Website auszuführen, die Ihnen die Informationen zur Verfügung stellt. –
Danke! Ja, die Funktionen sind im Grunde zwischen den Städten gleich - abgesehen davon, dass sie unterschiedliche Städte sind und unterschiedliche XML-Feeds erfordern. Cross-Domain ist zum Glück kein Problem, denn es ist für eine Webapp, verpackt für iPhone - so wird von einem lokalen Dir arbeiten. – Nelga