$(d).find('location#sydney')
是值得商榷的。 #sydney
表示具有值爲sydney
的屬性的元素具有模式類型ID
。在HTML中,由於DOCTYPE,id="..."
屬性的架構類型爲ID
。但是這個XML文件沒有DOCTYPE,因此它的id="..."
屬性沒有模式類型ID
。因此getElementById('sydney')
將不起作用,並且作爲選擇器的#sydney
不應起作用。
它在實踐中有效,因爲當您使用find()
時,jQuery會迴歸到它自己的'Sizzle'JavaScript選擇器匹配器,它只需查找id="..."
屬性就好像它是HTML一樣。但是Sizzle很慢,你不應該依賴這個實現細節。使用顯式屬性選擇器location[id=sydney]
對於XML文檔更好。
var sydneyuv = sydneyuv += '<span>' + uvindex + '</span>' ;
你在這裏有一個多餘的任務。您使用增強作業+=
將某些內容添加到sydneyuv
,然後再將結果分配給sydneyuv
。
此外,通常最好不要將來自輸入值的HTML字符串拼接在一起。如果uvindex
中包含HTML特殊字符怎麼辦? (它可能不會,但沒有什麼能阻止你將它包括在內的網站)。沒有HTML轉義,你會有HTML注入和潛在的XSS安全漏洞。始終使用DOM風格的方法,例如jQuery中的text()
和attr()
,或創建快捷方式:var $sydneyuv= $('<span/>', {text: uvindex});
,而不是字符串吊銷。
我希望我能以某種方式簡化它。
當然。讓數據驅動的:
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.'}
];
現在你可以用一個循環替換所有這些單獨的語句:
$.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;
}
});
});
想必類似的,無論天氣如何一個人做的。
(我使用完整的城鎮ID在HTML文檔的ID,所以你不需要shorttown
黑客攻擊。)
我看到相當多的重複,但質量明智我會說這是一個剛剛學習語言的人相當好。 – ChaosPandion 2010-11-05 01:23:47
重複*很多*。此外,如果您要嘗試在除提供信息的網站以外的任何網站上運行該代碼,您肯定會碰到跨域限制 – 2010-11-05 01:33:09
謝謝!是的,城市之間的功能基本相同 - 除了它們是「不同的」城市並需要不同的xml源。跨域是幸運的不是一個問題,因爲它是一個web應用程序,打包爲iPhone - 所以將從本地目錄工作。 – Nelga 2010-11-05 01:46:45