过于脆弱,
// 一旦有人为可读性加上该标志即退化为存储型 XSS。
var peaks = [{"t":16.8238,"i":38.8539,"hkl":"(1,1,-2,0)","d":5.26985},{"t":16.8367,"i":19.2567,"hkl":"(1,1,-2,-1)","d":5.26586},{"t":17.2698,"i":6.8521,"hkl":"(0,1,-1,1)","d":5.13474},{"t":17.3074,"i":13.7726,"hkl":"(0,1,-1,-2)","d":5.12368},{"t":19.9815,"i":9.5598,"hkl":"(0,0,0,2)","d":4.44362},{"t":20.025,"i":4.6775,"hkl":"(0,2,-2,-2)","d":4.43405},{"t":24.2096,"i":14.8999,"hkl":"(1,2,-3,0)","d":3.67629},{"t":24.2459,"i":7.4006,"hkl":"(1,2,-3,-2)","d":3.67087},{"t":27.2529,"i":15.9705,"hkl":"(2,0,-2,0)","d":3.27228},{"t":29.0797,"i":52.7633,"hkl":"(2,1,-3,0)","d":3.07075},{"t":29.0873,"i":26.3453,"hkl":"(2,1,-3,-1)","d":3.06995},{"t":29.8843,"i":56.4817,"hkl":"(1,2,-3,1)","d":2.98988},{"t":29.9216,"i":56.1533,"hkl":"(1,-1,0,3)","d":2.98623},{"t":29.944,"i":56.2731,"hkl":"(1,3,-4,-2)","d":2.98405},{"t":30.1679,"i":33.8254,"hkl":"(0,3,-3,0)","d":2.96241},{"t":30.2345,"i":16.7203,"hkl":"(0,3,-3,-3)","d":2.95604},{"t":32.4445,"i":9.9419,"hkl":"(2,1,-3,1)","d":2.75955},{"t":32.4653,"i":19.8649,"hkl":"(2,2,-4,-1)","d":2.75783},{"t":33.1957,"i":100,"hkl":"(1,3,-4,0)","d":2.6988},{"t":33.2569,"i":49.4952,"hkl":"(1,3,-4,-3)","d":2.69398},{"t":34.0246,"i":93.7455,"hkl":"(2,2,-4,0)","d":2.63493},{"t":34.0513,"i":46.4784,"hkl":"(2,2,-4,-2)","d":2.63293},{"t":34.9484,"i":44.6212,"hkl":"(0,2,-2,2)","d":2.56737},{"t":35.0263,"i":89.1737,"hkl":"(0,2,-2,-4)","d":2.56184},{"t":38.3921,"i":18.8424,"hkl":"(2,2,-4,1)","d":2.34464},{"t":38.4221,"i":18.8452,"hkl":"(2,3,-5,-1)","d":2.34288},{"t":38.44,"i":18.9504,"hkl":"(2,3,-5,-2)","d":2.34182},{"t":39.0312,"i":8.3074,"hkl":"(1,3,-4,1)","d":2.3077},{"t":39.0726,"i":8.3957,"hkl":"(1,-1,0,4)","d":2.30536},{"t":39.1198,"i":8.216,"hkl":"(1,-3,2,4)","d":2.30268},{"t":40.6052,"i":4.8809,"hkl":"(0,0,0,4)","d":2.22181},{"t":40.6967,"i":2.4962,"hkl":"(0,4,-4,-4)","d":2.21703},{"t":41.1011,"i":16.2356,"hkl":"(2,3,-5,0)","d":2.19614},{"t":41.1521,"i":8.0925,"hkl":"(2,3,-5,-3)","d":2.19354},{"t":42.677,"i":3.6421,"hkl":"(3,1,-4,0)","d":2.11863},{"t":42.6825,"i":1.7792,"hkl":"(3,1,-4,-1)","d":2.11837},{"t":42.991,"i":17.3244,"hkl":"(1,0,-1,4)","d":2.10388},{"t":43.0783,"i":8.5825,"hkl":"(1,4,-5,-4)","d":2.09981},{"t":44.8738,"i":3.3147,"hkl":"(2,2,-4,2)","d":2.01988},{"t":44.9371,"i":6.7684,"hkl":"(2,4,-6,-2)","d":2.01719},{"t":46.3668,"i":25.1645,"hkl":"(3,2,-5,0)","d":1.95826},{"t":46.3873,"i":12.5612,"hkl":"(3,2,-5,-2)","d":1.95744},{"t":46.6304,"i":16.4961,"hkl":"(1,3,-4,2)","d":1.94781},{"t":46.7123,"i":16.3057,"hkl":"(1,5,-6,-2)","d":1.94458},{"t":46.7378,"i":16.4969,"hkl":"(1,-3,2,5)","d":1.94358},{"t":48.9685,"i":13.5455,"hkl":"(1,1,-2,4)","d":1.86013},{"t":49.0129,"i":13.3441,"hkl":"(1,-1,0,5)","d":1.85855},{"t":49.0868,"i":13.4711,"hkl":"(1,5,-6,-4)","d":1.85593},{"t":49.5935,"i":8.8536,"hkl":"(2,4,-6,0)","d":1.83815},{"t":49.6717,"i":4.5003,"hkl":"(2,4,-6,-4)","d":1.83544},{"t":49.8327,"i":2.2599,"hkl":"(3,2,-5,1)","d":1.82988},{"t":49.8571,"i":2.2684,"hkl":"(3,3,-6,-1)","d":1.82905},{"t":49.8717,"i":2.2461,"hkl":"(3,3,-6,-2)","d":1.82854},{"t":52.0631,"i":38.4793,"hkl":"(3,3,-6,0)","d":1.75662},{"t":52.1056,"i":19.1626,"hkl":"(3,3,-6,-3)","d":1.75529},{"t":52.8828,"i":9.4399,"hkl":"(2,3,-5,2)","d":1.73131},{"t":52.9574,"i":9.4235,"hkl":"(2,5,-7,-2)","d":1.72904},{"t":52.9808,"i":9.4164,"hkl":"(2,3,-5,-5)","d":1.72834},{"t":53.4148,"i":28.5123,"hkl":"(1,0,-1,5)","d":1.71531},{"t":53.5307,"i":14.1175,"hkl":"(1,5,-6,-5)","d":1.71187},{"t":53.5405,"i":10.6199,"hkl":"(0,3,-3,3)","d":1.71158},{"t":53.6654,"i":20.9057,"hkl":"(0,3,-3,-6)","d":1.70789},{"t":55.025,"i":3.2152,"hkl":"(2,4,-6,1)","d":1.66887},{"t":55.0659,"i":3.15,"hkl":"(2,-1,-1,5)","d":1.66773},{"t":55.1339,"i":3.204,"hkl":"(2,-4,2,5)","d":1.66583},{"t":56.222,"i":21.3378,"hkl":"(4,0,-4,0)","d":1.63614},{"t":56.3037,"i":1.9834,"hkl":"(3,3,-6,1)","d":1.63396},{"t":56.335,"i":1.997,"hkl":"(3,4,-7,-1)","d":1.63313},{"t":56.3708,"i":1.9859,"hkl":"(3,4,-7,-3)","d":1.63218},{"t":56.5376,"i":2.3394,"hkl":"(1,4,-5,2)","d":1.62776},{"t":56.6269,"i":2.3023,"hkl":"(1,2,-3,-6)","d":1.6254},{"t":56.6803,"i":2.3735,"hkl":"(1,6,-7,-4)","d":1.624},{"t":57.2533,"i":2.9784,"hkl":"(4,1,-5,0)","d":1.6091},{"t":57.2577,"i":1.4721,"hkl":"(4,1,-5,-1)","d":1.60899},{"t":59.152,"i":19.227,"hkl":"(2,0,-2,5)","d":1.5619},{"t":59.2603,"i":9.4219,"hkl":"(2,-5,3,5)","d":1.55931},{"t":59.3729,"i":9.8264,"hkl":"(3,4,-7,0)","d":1.55662},{"t":59.4421,"i":4.8903,"hkl":"(3,4,-7,-4)","d":1.55497},{"t":60.2789,"i":1.1091,"hkl":"(4,2,-6,0)","d":1.53537},{"t":61.217,"i":1.7764,"hkl":"(2,3,-5,-6)","d":1.51408},{"t":62.3098,"i":5.9054,"hkl":"(3,3,-6,2)","d":1.49012},{"t":62.3771,"i":5.8316,"hkl":"(3,5,-8,-2)","d":1.48868},{"t":62.3981,"i":5.8669,"hkl":"(3,-3,0,5)","d":1.48823},{"t":63.2075,"i":1.3698,"hkl":"(4,1,-5,2)","d":1.4711},{"t":63.2283,"i":1.3616,"hkl":"(4,3,-7,-1)","d":1.47067},{"t":63.2408,"i":1.3537,"hkl":"(4,3,-7,-2)","d":1.47041},{"t":64.2489,"i":6.7506,"hkl":"(3,4,-7,1)","d":1.44975},{"t":64.2861,"i":6.6425,"hkl":"(3,-1,-2,5)","d":1.449},{"t":64.3481,"i":6.7103,"hkl":"(3,5,-8,-4)","d":1.44776},{"t":64.5023,"i":4.8936,"hkl":"(1,6,-7,0)","d":1.44467},{"t":64.6507,"i":2.3714,"hkl":"(1,6,-7,-6)","d":1.44171},{"t":64.989,"i":1.1975,"hkl":"(2,1,-3,5)","d":1.43502},{"t":65.0342,"i":1.161,"hkl":"(2,-1,-1,6)","d":1.43413},{"t":65.1318,"i":3.9137,"hkl":"(4,3,-7,0)","d":1.43222},{"t":65.1327,"i":1.1961,"hkl":"(2,-6,4,5)","d":1.4322},{"t":65.1687,"i":1.9505,"hkl":"(4,3,-7,-3)","d":1.4315},{"t":65.4047,"i":4.2029,"hkl":"(1,4,-5,3)","d":1.4269},{"t":65.5398,"i":4.166,"hkl":"(1,3,-4,-7)","d":1.42429},{"t":65.5607,"i":3.172,"hkl":"(0,5,-5,2)","d":1.42388},{"t":65.5684,"i":4.2044,"hkl":"(1,4,-5,-7)","d":1.42374},{"t":65.6588,"i":3.1694,"hkl":"(0,2,-2,-7)","d":1.42199},{"t":65.7446,"i":3.1628,"hkl":"(0,7,-7,-5)","d":1.42035},{"t":67.2956,"i":14.7253,"hkl":"(1,5,-6,2)","d":1.39134},{"t":67.3924,"i":14.7875,"hkl":"(1,2,-3,-7)","d":1.38957},{"t":67.4771,"i":14.6271,"hkl":"(1,5,-6,-7)","d":1.38803},{"t":67.9358,"i":9.6731,"hkl":"(4,2,-6,2)","d":1.37978},{"t":67.984,"i":19.4395,"hkl":"(4,4,-8,-2)","d":1.37891},{"t":68.0372,"i":2.0208,"hkl":"(3,5,-8,0)","d":1.37797},{"t":70.552,"i":8.2411,"hkl":"(2,4,-6,3)","d":1.33489},{"t":70.6823,"i":8.1178,"hkl":"(2,3,-5,-7)","d":1.33275},{"t":70.7099,"i":8.212,"hkl":"(2,4,-6,-7)","d":1.3323},{"t":70.769,"i":1.9799,"hkl":"(3,4,-7,2)","d":1.33133},{"t":70.8479,"i":1.9511,"hkl":"(3,6,-9,-2)","d":1.33004},{"t":70.8952,"i":1.9918,"hkl":"(3,6,-9,-4)","d":1.32927},{"t":71.0029,"i":1.0029,"hkl":"(1,6,-7,1)","d":1.32752},{"t":71.6279,"i":1.138,"hkl":"(4,4,-8,0)","d":1.31746},{"t":72.3788,"i":3.3435,"hkl":"(2,2,-4,5)","d":1.30563},{"t":72.4725,"i":3.3447,"hkl":"(2,-2,0,7)","d":1.30418},{"t":72.5545,"i":3.3751,"hkl":"(2,7,-9,-5)","d":1.3029},{"t":73.0724,"i":2.2436,"hkl":"(5,1,-6,0)","d":1.29494},{"t":73.0763,"i":1.0899,"hkl":"(5,1,-6,-1)","d":1.29489},{"t":73.4989,"i":2.652,"hkl":"(3,5,-8,1)","d":1.28848},{"t":73.5416,"i":2.6374,"hkl":"(3,6,-9,-1)","d":1.28784},{"t":73.6347,"i":2.623,"hkl":"(3,6,-9,-5)","d":1.28644},{"t":74.3102,"i":6.0219,"hkl":"(4,3,-7,2)","d":1.27641},{"t":74.372,"i":6.0517,"hkl":"(4,5,-9,-2)","d":1.2755},{"t":74.3914,"i":5.944,"hkl":"(4,5,-9,-3)","d":1.27522},{"t":75.7582,"i":5.797,"hkl":"(5,2,-7,0)","d":1.25558},{"t":75.7735,"i":2.8773,"hkl":"(5,2,-7,-2)","d":1.25536},{"t":76.4181,"i":6.9903,"hkl":"(1,0,-1,7)","d":1.24637},{"t":76.6057,"i":3.5227,"hkl":"(1,7,-8,-7)","d":1.24378},{"t":77.3956,"i":1.0426,"hkl":"(0,6,-6,2)","d":1.23305},{"t":77.5024,"i":1.0498,"hkl":"(0,2,-2,-8)","d":1.23162},{"t":77.6244,"i":1.0544,"hkl":"(0,6,-6,-8)","d":1.22999},{"t":77.9677,"i":5.3674,"hkl":"(3,6,-9,0)","d":1.22543},{"t":78.1047,"i":2.6204,"hkl":"(3,6,-9,-6)","d":1.22362},{"t":78.4047,"i":5.7798,"hkl":"(5,2,-7,1)","d":1.21969},{"t":78.4237,"i":5.8232,"hkl":"(5,3,-8,-1)","d":1.21944},{"t":78.4351,"i":5.809,"hkl":"(5,3,-8,-2)","d":1.2193},{"t":79.02,"i":7.1436,"hkl":"(1,6,-7,2)","d":1.21173},{"t":79.1262,"i":7.1665,"hkl":"(1,-2,1,8)","d":1.21037},{"t":79.2475,"i":7.1233,"hkl":"(1,6,-7,-8)","d":1.20883},{"t":79.6451,"i":2.2016,"hkl":"(4,5,-9,0)","d":1.20379},{"t":79.7397,"i":1.1075,"hkl":"(4,5,-9,-5)","d":1.2026},{"t":80.1675,"i":1.0588,"hkl":"(5,0,-5,3)","d":1.19725},{"t":80.5629,"i":9.4303,"hkl":"(3,5,-8,2)","d":1.19237},{"t":80.6535,"i":9.4779,"hkl":"(3,2,-5,-7)","d":1.19126},{"t":80.7327,"i":9.4407,"hkl":"(3,-5,2,7)","d":1.19029},{"t":81.225,"i":7.444,"hkl":"(2,5,-7,3)","d":1.18432},{"t":81.3597,"i":3.9573,"hkl":"(4,3,-7,3)","d":1.1827},{"t":81.3719,"i":7.4277,"hkl":"(2,-3,1,8)","d":1.18255},{"t":81.4321,"i":7.2816,"hkl":"(2,8,-10,-5)","d":1.18183},{"t":81.4614,"i":7.8116,"hkl":"(4,6,-10,-3)","d":1.18148},{"t":81.799,"i":5.141,"hkl":"(0,7,-7,1)","d":1.17746},{"t":81.8554,"i":5.0448,"hkl":"(0,1,-1,-8)","d":1.17679},{"t":82.0359,"i":5.0885,"hkl":"(0,8,-8,-7)","d":1.17465},{"t":82.2347,"i":1.2988,"hkl":"(4,4,-8,2)","d":1.17232},{"t":82.3098,"i":1.3267,"hkl":"(4,6,-10,-2)","d":1.17144},{"t":82.3549,"i":1.2867,"hkl":"(4,6,-10,-4)","d":1.17091},{"t":84.8494,"i":1.3369,"hkl":"(4,5,-9,1)","d":1.14275},{"t":84.8905,"i":1.3344,"hkl":"(4,6,-10,-1)","d":1.1423},{"t":84.9802,"i":1.3357,"hkl":"(4,6,-10,-5)","d":1.14132},{"t":85.222,"i":1.3031,"hkl":"(0,4,-4,5)","d":1.1387},{"t":85.4312,"i":1.2994,"hkl":"(0,4,-4,-9)","d":1.13645},{"t":85.4648,"i":1.2589,"hkl":"(0,5,-5,-9)","d":1.13609},{"t":86.2488,"i":1.9557,"hkl":"(5,4,-9,0)","d":1.12776},{"t":86.816,"i":1.6304,"hkl":"(1,4,-5,5)","d":1.12185},{"t":87.0248,"i":1.6456,"hkl":"(1,4,-5,-9)","d":1.11969},{"t":87.0583,"i":1.6375,"hkl":"(1,9,-10,-5)","d":1.11935},{"t":88.8158,"i":3.3181,"hkl":"(5,3,-8,2)","d":1.10169},{"t":88.8754,"i":3.2464,"hkl":"(5,5,-10,-2)","d":1.1011},{"t":88.894,"i":3.2677,"hkl":"(5,5,-10,-3)","d":1.10092},{"t":89.1862,"i":1.0229,"hkl":"(4,6,-10,0)","d":1.09807},{"t":89.2095,"i":2.7162,"hkl":"(3,5,-8,3)","d":1.09785},{"t":89.2653,"i":3.7817,"hkl":"(3,0,-3,7)","d":1.0973},{"t":89.3547,"i":2.6904,"hkl":"(3,-3,0,8)","d":1.09644},{"t":89.4142,"i":2.7065,"hkl":"(3,8,-11,-5)","d":1.09586},{"t":89.4478,"i":1.9162,"hkl":"(3,7,-10,-7)","d":1.09554}];
// 图例文案(中文站字面量;英文站模板传英文,见 en/page/detail.php)
var LBL_MATERIAL_PEAK = '材料衍射峰';
var initialRadiation = 'Cu Kα';
var canvas = document.getElementById('xrd-detail-canvas');
var note = document.getElementById('xrd-note');
var body = document.getElementById('xrd-peaks-body');
var cnt = document.getElementById('xrd-peaks-count');
var sel = document.getElementById('xrd-target');
var link = document.getElementById('xrd-direct-link');
var mpId = "mp-1106063";
function renderChart(ps, radiation) {
if (typeof XrdChart === 'undefined' || !canvas || !Array.isArray(ps)) return;
var m = 0;
ps.forEach(function (p) { if (p.t > m) m = p.t; });
var mt = Math.max(90, Math.ceil((m + 5) / 10) * 10);
XrdChart.render(canvas, { materialPeaks: ps, label: radiation, maxTheta: mt, materialPeakLabel: LBL_MATERIAL_PEAK });
}
function renderTable(ps) {
if (!body) return;
var rows = '';
ps.slice(0, 24).forEach(function (pk) {
var t = (pk.t != null) ? Number(pk.t).toFixed(2) : '';
var d = (pk.d != null) ? Number(pk.d).toFixed(4) : '';
var i = (pk.i != null) ? Number(pk.i).toFixed(1) : '';
var h = (pk.hkl != null) ? String(pk.hkl).replace(/[<>&]/g, '') : '';
rows += '
' + t + '
' + d + '
' + i + '
' + h + '
';
});
body.innerHTML = rows;
if (cnt) cnt.textContent = Math.min(ps.length, 24);
}
function updateLink(target) {
if (link) link.href = location.origin + '/api/v1/materials/' + encodeURIComponent(mpId) + '/xrd?format=raw&target=' + encodeURIComponent(target);
}
// 初始渲染(服务端已预取默认靶材的图谱)
renderChart(peaks, initialRadiation);
if (sel) updateLink(sel.value);
// 切换靶材:重新拉取该靶材的衍射图谱并刷新图表 / 表格 / 直接链接
if (sel) {
var xrdSeq = 0;
sel.addEventListener('change', function () {
var t = sel.value;
updateLink(t);
var my = ++xrdSeq;
// 先清空 loading 态,避免请求失败后按钮一直停在“切换中”
if (note) note.textContent = '正在加载 ' + t + ' 图谱…';
fetch('/api/v1/materials/' + encodeURIComponent(mpId) + '/xrd?target=' + encodeURIComponent(t))
.then(function (r) {
if (!r.ok) throw new Error('HTTP ' + r.status);
return r.json();
})
.then(function (res) {
// 竞态防护:快速切换靶材时,先发的请求可能后到,丢弃过期响应
if (my !== xrdSeq) return;
if (!res.success || !res.data || !Array.isArray(res.data.peaks) || !res.data.peaks.length) {
throw new Error(res.error || '该靶材暂无衍射数据');
}
var d = res.data;
if (note) note.textContent = '横轴为 2θ (°),纵轴为相对强度,' + d.radiation + ' , λ=' + d.wavelength + ' Å';
renderChart(d.peaks, d.radiation);
renderTable(d.peaks);
})
.catch(function (e) {
if (my !== xrdSeq) return;
// 恢复服务端预取的默认靶材视图,并明确提示失败原因
// (旧实现是空 catch,静默失败会让图表停留在上一个靶材的数据而用户毫不知情)
if (note) note.textContent = '切换靶材失败:' + (e && e.message ? e.message : '未知错误');
renderChart(peaks, initialRadiation);
renderTable(peaks);
});
});
}
})();
The crystal structure and related material properties of Pr7Pt3 were obtained from the Materials Project database (MP-ID: mp-1106063, database version v2026.04.13).
文献引用
Horton, M.K., Huck, P., Yang, R.X. et al. Accelerated data-driven materials science with the Materials Project. Nat. Mater. 24, 1522–1532 (2025).
https://doi.org/10.1038/s41563-025-02272-0