Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Bookmarklet для сайта ЦБ РФ (https://javascript.ru/forum/project/71088-bookmarklet-dlya-sajjta-cb-rf.html)

Nexus 25.10.2017 14:57

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'));
})();

Можно ли получить более короткое решение?

Alexandroppolus 25.10.2017 15:48

не проверял
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 это нафиг не надо.

laimas 25.10.2017 16:54

Nexus,
у ЦБ РФ теперь есть SOAP для получения курсов валют, драгметаллов и прочей информации, это лучше чем парсить текст.

Nexus 25.10.2017 17:09

laimas, в букмарклете обращаться к серверу ЦБ для получения этих данных?)
Обратиться к элементам страницы и получить нужные данные куда проще и быстрее.

Нужно было просто написать букмарклет, ни больше.
Это было тестовое задание перед собеседованием.

Alexandroppolus 25.10.2017 17:21

курс доллара (строка):
$('#widget_exchange tr:has(ins:contains("$")) .w_data_wrap')[0].lastChild.data


стоимость золота (строка):
$('#widget_metal tr:has(ins:contains("Au")) .w_data_wrap>span').text()

Nexus 25.10.2017 17:25

Alexandroppolus, :)
$('#widget_metal .content table tr:eq(1) td:eq(1)')
$('#widget_metal tr:has(ins:contains("Au")) .w_data_wrap>span')

laimas 25.10.2017 17:31

Цитата:

Сообщение от Nexus
в букмарклете обращаться к серверу ЦБ для получения этих данных?

Цитата:

Сообщение от Nexus
'www.cbr.ru'

Это на это.

Nexus 25.10.2017 17:35

Цитата:

Сообщение от laimas
Это на это.

Можно более развернуто?

laimas 25.10.2017 17:44

Цитата:

Сообщение от Nexus
Можно более развернуто?

Я вижу запрос к банку, разбор, вот и написал, что есть SOAP для этого. )

Nexus 25.10.2017 18:05

laimas, во второй строке была проверка на нахождение пользователя на указанной странице.


Часовой пояс GMT +3, время: 21:59.