22.04.2014, 12:09
|
Интересующийся
|
|
Регистрация: 27.01.2013
Сообщений: 24
|
|
Динамическое изменение значений диаграммы в зависимости от значения ползунков
!!! В песочнице сохранить не могу - выдает error - 500 (Service unavailable (with message)). Поэтому пример в аттаче - sliderDiagram.zip.
Диаграма появится, если сдвинуть все ползунки поочереди (от первого к последнему), когда последний изменит свое значение - появится диаграмма.
Использую http://www.highcharts.com/demo/pie-legend за основу для диаграммы.
В примере - данные для диаграммы - статичны, в моем случае, значения нужно подтянуть из ползунков.
Не использую clip/jquery ui и т.д. для ползунка, т.к. функционал будет работать на IE11 на touch девайсе, из рабочих вариантов остался только input type="range". Он корректно работает на девайсе (и с мышью и с "пальцем"). (Note: Lenovo ThinkPad Helix i7 + IE 11 ).
Для слайдеров, использую такую конструкцию:
<input type="range" id="slider" min="1" max="5" onchange="this.id=this.value" value="1">
Скрипт:
$('#slider2').change(function () {
var b = this.value;
z2 = b * p;
console.log('z2=', z2);
Чтобы работало - функция change для кадлого последующего слайдера, вставлена в предыдущую. ну и соответственно, диаграмма обновляется, когда сдвигаем последний слайдер.
Нужно, чтобы диаграмма обновлялась при изменении значения каждого отдельно взятого слайдера.
Дайте, пожалуйста, пинка в правильном направлении.
|
|
22.04.2014, 12:38
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
Так а зачем они вложены то в друг друга? Чтобы undefined что ли в диаграмму не попадало? Ну так что мешает задать значения по умолчанию и при каждом изменении слайдера обновлять данные? Там вроде в API методы для обновления данных есть.
|
|
22.04.2014, 12:44
|
Интересующийся
|
|
Регистрация: 27.01.2013
Сообщений: 24
|
|
да, чтобы undefined в диаграмму не попадало. в диаграмме используются z1 - z5, которые изменяются, в зависимости, от изменения значения слайдера. Туплю на моменте, как передать значения по отдельности и обновлять данные, чтобы при этом не было undefined.
|
|
22.04.2014, 12:51
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
Сообщение от Volchen0ck
|
да, чтобы undefined в диаграмму не попадало. в диаграмме используются z1 - z5, которые изменяются, в зависимости, от изменения значения слайдера. Туплю на моменте, как передать значения по отдельности и обновлять данные, чтобы при этом не было undefined.
|
Ну у тебя же когда ползунки стоят в левом положении диаграмма как-то пересчитывается. Вот и задай эти значения для переменных при объявлении. При загрузке же страницы ползунки будут в левом положении, значит value у них будет 1, значит все твои z1-z5 будут равны p. Ну так и напиши var z1 = p, z2 = p и т.д. Если по умолчанию ползунки не в левом положении то смотри чему равно их value и умножаешь. Ну а при каждом change ползунков перестраивашь диаграму с изменившимися данными. Там в API есть setData: http://api.highcharts.com/highcharts#Series.setData
Вроде то что надо.
Последний раз редактировалось jsnb, 22.04.2014 в 12:56.
|
|
22.04.2014, 16:04
|
Интересующийся
|
|
Регистрация: 27.01.2013
Сообщений: 24
|
|
глобально присваиваю z1=p, z2= p и т.д. - диаграмма делится на 6 равных частей. Согласно докам, после добавления/изменения вызываю chart.redraw().
$('#slider1').change(function () {
var a = this.value; z1 = a * p;
// $('#container').highcharts().redraw();
chart.redraw()
});
значения не видит, в консоли error - undefined or null reference.
Если можно, "ткните носом".
|
|
22.04.2014, 16:21
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
Так redraw и так там по умолчанию автоматически делается после изменения данных. От того что переменный поменялись данные автоматически в диаграму не попадут. Я же дал ссылку на метод, который обновляет данные. Вызываете его, передаете новый data массив с новыми значениями переменных и оно само вам красиво всё перерисует. Там же даже по ссылке демка есть как оно работает.
Кстати, вот это вот в слайдерах зачем:
onchange="this.id=this.value"
?
Просто если это убрать, то можно вообще 1 обработчик повесить на все эти слайдеры который будет по id определять какую z ему надо обновить.
|
|
22.04.2014, 16:40
|
Интересующийся
|
|
Регистрация: 27.01.2013
Сообщений: 24
|
|
тяжело быть бестолковым! сорри.
$('.slider').click(function() {
var chart = $('#container').highcharts();
chart.series[0].setData([z1, z2, z3, z4, z5, z6]);
});
,
жаль только не обновляются так красиво, как в первый раз, когда страница загружается.
Спасибо большое за помощь!
|
|
22.04.2014, 17:15
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
Сообщение от Volchen0ck
|
[JS]chart.series[0].setData([z1, z2, z3, z4, z5, z6]);
|
А так текстовые метки на диаграмме не теряются?
Сообщение от Volchen0ck
|
жаль только не обновляются так красиво, как в первый раз, когда страница загружается.
|
Так никто не мешает ее пересоздавать с новыми данными каждый раз. Только перед созданием новой надо уничтожить через destroy() старую, чтобы память освободить. Ну и это по ресурсам более затратно, особенно мобильные платформы могут быть чувствительны.
Последний раз редактировалось jsnb, 22.04.2014 в 17:46.
|
|
23.04.2014, 13:15
|
Интересующийся
|
|
Регистрация: 27.01.2013
Сообщений: 24
|
|
Текстовые метки можно вернуть вот так
series: [{
name: 'form',
data: [['Value1', z1],
['Value2',z2],
['Value3',z3],
['Value4',z4],
['Value5', z5],
['Value6', z6]]
}]
Не могу найти, можно ли использовать картинки, в качестве меток, а не текст. Скорее всего нельзя.
|
|
|
|