/* chem8_ch6_widgets.js — виджеты Главы 6 «Растворы». * Использует window.Chem8: classifier, solubilityTable, molarMass. */ (function (W) { 'use strict'; function C() { return W.Chem8 || {}; } function $(id) { return document.getElementById(id); } function rr(v, d) { var p = Math.pow(10, d == null ? 2 : d); return (Math.round(v * p) / p).toString().replace('.', ','); } /* §46 — классификатор смесей */ function mount_p46() { var el = $('c-mix'); if (!el || el._b || !C().classifier) return; el._b = 1; C().classifier(el, { items: [ { id: 'air', label: 'воздух', cat: 'odn' }, { id: 'saltsol', label: 'раствор соли', cat: 'odn' }, { id: 'steel', label: 'сталь', cat: 'odn' }, { id: 'sandwater', label: 'песок + вода', cat: 'neod' }, { id: 'milk', label: 'молоко', cat: 'neod' }, { id: 'granite', label: 'гранит', cat: 'neod' } ], buckets: [{ cat: 'odn', label: 'Однородные (растворы)' }, { cat: 'neod', label: 'Неоднородные' }], onCheck: function (ok) { if (ok && W.addXp) W.addXp(8, 'p46-mix'); } }); } /* §48 — кривая растворимости s = f(t) */ var CURVE = { KNO3: [13, 21, 32, 46, 64, 88, 110, 138, 169, 202, 246], NaCl: [35.7, 35.8, 36, 36.3, 36.6, 37, 37.3, 37.8, 38.4, 39, 39.8] }; function mount_p48() { var el = $('c-solcurve'); if (!el || el._b) return; el._b = 1; el.innerHTML = '
'; var sub = $('sc-sub'), tr = $('sc-t'), tv = $('sc-tv'), plot = $('sc-plot'), out = $('sc-out'); function draw() { var data = CURVE[sub.value], t = +tr.value, idx = t / 10, s = data[idx]; tv.textContent = t + ' °C'; var maxS = Math.max.apply(null, CURVE.KNO3); var W0 = 280, H0 = 140, pad = 24; var pts = data.map(function (v, i) { var x = pad + i / 10 * (W0 - pad * 2); var y = H0 - pad - v / maxS * (H0 - pad * 2); return x.toFixed(1) + ',' + y.toFixed(1); }).join(' '); var cx = pad + idx / 10 * (W0 - pad * 2), cy = H0 - pad - s / maxS * (H0 - pad * 2); plot.innerHTML = '' + '' + '' + '' + '' + 't, °C' + 's, г/100г' + ''; out.className = 'out ok'; out.innerHTML = 'При ' + t + ' °C растворимость ' + sub.value + ' ≈ ' + rr(s, 1) + ' г на 100 г воды.' + (sub.value === 'KNO3' ? ' Растворимость сильно растёт с температурой.' : ' У NaCl почти не зависит от t.') + ''; } sub.addEventListener('change', draw); tr.addEventListener('input', draw); draw(); } /* §50 — массовая доля w */ function mount_p50() { var el = $('c-wcalc'); if (!el || el._b) return; el._b = 1; el.innerHTML = '
'; function calc() { var ms = parseFloat($('w-ms').value), mw = parseFloat($('w-mw').value); if (isNaN(ms) || isNaN(mw) || ms + mw <= 0) { $('w-out').className = 'out bad'; $('w-out').textContent = 'Введите массы.'; return; } var w = ms / (ms + mw) * 100; $('w-out').className = 'out ok'; $('w-out').innerHTML = 'm(раствора) = ' + ms + ' + ' + mw + ' = ' + (ms + mw) + ' г
w = m(в-ва)/m(р-ра) = ' + ms + '/' + (ms + mw) + ' = ' + rr(w, 1) + ' %
'; } $('w-go').addEventListener('click', calc); calc(); } /* §51 — молярная концентрация c = n/V */ function mount_p51() { var el = $('c-ccalc'); if (!el || el._b) return; el._b = 1; el.innerHTML = '
'; function calc() { var f = $('c-f').value.trim(), M = C().molarMass ? C().molarMass(f) : NaN, m = parseFloat($('c-m').value), V = parseFloat($('c-v').value); if (isNaN(M)) { $('c-out').className = 'out bad'; $('c-out').textContent = 'Не удалось разобрать формулу.'; return; } if (isNaN(m) || isNaN(V) || V <= 0) { $('c-out').className = 'out bad'; $('c-out').textContent = 'Введите m и V.'; return; } var n = m / M, c = n / V; $('c-out').className = 'out ok'; $('c-out').innerHTML = 'M(' + f + ') = ' + M + ' г/моль
n = m/M = ' + m + '/' + M + ' = ' + rr(n) + ' моль
c = n/V = ' + rr(n) + '/' + rr(V) + ' = ' + rr(c) + ' моль/л
'; } $('c-go').addEventListener('click', calc); calc(); } W.CHEM8_WIDGETS = { p46: mount_p46, p50: mount_p50, p51: mount_p51 }; W.FLAG_MOUNTS = { p48: mount_p48 }; })(window);