Bookmarklet для сайта ЦБ РФ
Нужно было реализовать букмарклет, который алертил бы стоимости килограмма золота в USD с точностью до сотых.
Я реализовал этот так:
javascript: (function() {
if (location.href.split('://').pop().replace('/', '') != 'www.cbr.ru') return !1;
var f = function(c) {
return {
',': '.'
}[c] || '';
},
e = /\D+?/g,
p = $('#widget_metal .content table tr:eq(1) td:eq(1)').text().replace(e, f) * 1e3,
r = {
t: [],
d: []
};
$('#widget_exchange .content table tr:lt(2)').each(function(i) {
r[i ? 'd' : 't'] = $.makeArray($(this).find('>*:gt(0)').map(function() {
return $(this).text().replace(e, f);
}));
});
alert(r.t.map(function(s, i) {
return s.replace(/(\d{2})(\d{2})(\d+)/, '$1.$2.$3: ') + (p / r.d[i]).toFixed(2);
}).join('\n'));
})();
Можно ли получить более короткое решение? |
не проверял
javascript: (function() {
var f = e => $(e).text().replace(/,/g,'.').replace(/[^\d\.]/g,''),
p = f($('#widget_metal .content table tr:eq(1) td:eq(1)')) * 1e3,
r = {t: [], d: []};
$('#widget_exchange .content table tr:lt(2)').each((i,e) => {
r[i ? 'd' : 't'] = [].map.call($(e).find('>*:gt(0)'),f);
});
alert(r.t.map((s, i) => s.replace(/(\d\d)(\d\d)(\d+)/, '$1.$2.$3: ') + (p / r.d[i]).toFixed(2)).join('\n'));
})();
твою строку 2 я выкинул, потому что в bookmarklet это нафиг не надо. |
Nexus,
у ЦБ РФ теперь есть SOAP для получения курсов валют, драгметаллов и прочей информации, это лучше чем парсить текст. |
laimas, в букмарклете обращаться к серверу ЦБ для получения этих данных?)
Обратиться к элементам страницы и получить нужные данные куда проще и быстрее. Нужно было просто написать букмарклет, ни больше. Это было тестовое задание перед собеседованием. |
курс доллара (строка):
$('#widget_exchange tr:has(ins:contains("$")) .w_data_wrap')[0].lastChild.data
стоимость золота (строка):
$('#widget_metal tr:has(ins:contains("Au")) .w_data_wrap>span').text()
|
Alexandroppolus, :)
$('#widget_metal .content table tr:eq(1) td:eq(1)')
$('#widget_metal tr:has(ins:contains("Au")) .w_data_wrap>span')
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
laimas, во второй строке была проверка на нахождение пользователя на указанной странице.
|
Nexus, а почему бы не проверять так?
if(document.domain !== 'www.cbr.ru') return !1 И для чего нужна метка javascript? И зачем возвращать значение, если оно никуда не записывается? |
Цитата:
Цитата:
Если убрать эту строку, то браузер просто попытается перейти по этому коду, как по адресу. Иными словами строка "javascript" указывает браузеру, что дальнейшую кашу нужно воспроизвести, как js код. |
Nexus,
В чем хитрость инициализации массива с параметром рядом с объектом на 6 строке? |
Rasy,
return {',': '.'}[c] || '';
Это не инициализация массива рядом с объектом, это инициализация объекта и последующее обращение к его свойству, название которого записано в переменной "c" (char). Строку можно переписать так: return c==','?'.':''; Или расписать так:
var obj={',':'.'};
return (c in obj)?obj[c]:'';
|
Nexus,
Понял. Это сеньерский уровень писать трудночитаемый будто минифицированный код:) return !1 можно ведь return false Только странно, что используется jQuery |
Rasy, это букмарклет.
Я старался писать минимальное кол-во кода. return false;на 3 символа длиннее) Цитата:
PS. До Senior js мне как до Пекина раком. |
Rasy, сеньоры не заморачиваются по этому поводу, по итогу скрипт прогоняют через какой-нибудь сборщик/обфускатор. :)
|
ruslan_mart,
личный опыт?) |
| Часовой пояс GMT +3, время: 16:33. |