Подтвердить что ты не робот

Отображение пользовательской подсказки при наведении курсора на точку в лотке

Из примера здесь, я как бы знаю, как создать график флота, который показывает всплывающие подсказки при зависании. Но примеры только показывают, как отображать всплывающие подсказки, содержащие значение x, значение y, метку и т.д., И я не могу понять, как создавать более настраиваемые всплывающие подсказки.

Есть ли где-нибудь я могу прикреплять пользовательские данные, к которым я могу получить доступ при создании всплывающей подсказки?

Например, чтобы упростить, пусть мой код выглядит так:

var d = [ { label: "Fake!", data: [ [1290802154, 0.3], [1292502155, 0.1] ] } ];
var options = {
    xaxis: { mode: "time" },
    series: {
    lines: { show: true },
        points: { show: true }
    },
    grid: { hoverable: true, clickable: true }
};
$.plot($("#placeholder"), d, options);

Теперь, когда вы нажимаете на первый datapoint, я хочу, чтобы всплывающая подсказка показывала "Hello", а при нажатии на второй datapoint я хочу показать "Bye". Как мне это сделать? При привязке события plothover

$(".placeholder").bind("plothover", function (event, pos, item) { /* etc. */ };

Я не уверен, что означает "item", и как прикрепить к нему данные.

4b9b3361

Ответ 1

Вот пример JSFiddle, который я взбивал. Не уверен, что он работает точно так, как вам нравится, но может спровоцировать идею...

[обновление]

вы хотите привязать к

$("#placeholder").bind("plotclick", function (event, pos, item) {/* code */});

событие для кликов событий

[update2] Обновленный пример

Я скорректировал этот пример, чтобы использовать ваши тестовые данные и больше работать с тем, что вы описали выше. Что касается объекта item, кажется, что он генерируется "на лету", поэтому, насколько я могу судить, вы не можете добавить к нему дополнительные данные. Тем не менее, вы можете создать массив для кэширования объектов item при щелчке и добавления к ним дополнительных данных и использования их для события hover.

Этот новый пример делает именно это, он показывает обычную подсказку, когда ничего не нажимается. но после щелчка он определяет, была ли точка нажата первой или второй, и добавляет свойство добавления к объекту item с именем alternateText и сохраняет его в массиве с именем itemsClicked.

Теперь, когда точка наводится на нее, она проверяет, существует ли в массиве кешированный объект item на основе того же индекса текущего объекта item, который получается через item.dataIndex. Если в массиве кеша itemsClicked имеется соответствующий индекс, он будет извлекать из него объект item и использовать свойство alternateText, которое было добавлено во время события click ранее.

Первая точка объекта item будет выглядеть примерно так:

item : {
    dataIndex: 0,
    datapoint: [
        1290802154,
        0.3
    ],
    pageX: 38,
    pageY: 82,
    series: {/* properties of the series that this point is in */},
    seriesIndex: 0
}

После щелчка он будет выглядеть так и храниться в массиве itemsClicked:

item : {
    alternateText: 'hello',
    dataIndex: 0,
    datapoint: [
        1290802154,
        0.3
    ],
    pageX: 38,
    pageY: 82,
    series: {/* properties of the series that this point is in */},
    seriesIndex: 0
}

Пожалуйста, дайте мне знать, если это полезно или нет, если нет, я закрою и перестану обновлять свой ответ: P

Ответ 2

Вы можете добавить данные в серию, просто добавив их в массив данных.

Вместо

$.plot(element, [[1, 2], [2, 4]] ...)

Вы можете

$.plot(element, [[1, 2, "label"], [2, 4, "another label"]] ...)

И затем используйте эту информацию, чтобы показать пользовательскую метку.

Смотрите эту скрипку для полного примера: http://jsfiddle.net/UtcBK/328/

Ответ 3

Также вы можете попробовать следующий код:

Тело HTML:

<div id="content">
    <div class="demo-container">
        <div id="placeholder" class="demo-placeholder"></div>
    </div>
</div>

Script:

<script type="text/javascript">
    function showTooltip(x, y, contents, z) {
        $('<div id="tooltip">' + contents + '</div>').css({
            position: 'absolute',
            display: 'none',
            top: y - 30,
            left: x - 110,
            'font-weight':'bold',
            border: '1px solid rgb(255, 221, 221)',
            padding: '2px',
            'background-color': z,
            opacity: '0.8'
     }).appendTo("body").show();
     };

    $(document).ready(
                 $(function () {
                     var data = [{
                         "label": "scott",
                         "data": [[1317427200000 - 5000000 * 3, "17017"], [1317513600000 - 5000000 * 5, "77260"]]
                     },
        {
            "label": "martin",
            "data": [[1317427200000 - 5000000 * 2, "96113"], [1317513600000 - 5000000 * 4, "33407"]]
        },
        {
            "label": "solonio",
            "data": [[1317427200000 - 5000000, "13041"], [1317513600000 - 5000000 * 3, "82943"]]
        },
        {
            "label": "swarowsky",
            "data": [[1317427200000, "83479"], [1317513600000 - 5000000 * 2, "96357"], [1317600000000 - 5000000, "55431"]]
        },
        {
            "label": "elvis",
            "data": [[1317427200000 + 5000000, "40114"], [1317513600000 - 5000000 * 1, "47065"]]
        },
        {
            "label": "alan",
            "data": [[1317427200000 + 5000000 * 2, "82504"], [1317513600000, "46577"]]
        },
        {
            "label": "tony",
            "data": [[1317513600000 + 5000000, "88967"]]
        },
        {
            "label": "bill",
            "data": [[1317513600000 + 5000000 * 2, "60187"], [1317600000000, "39090"]]
        },
        {
            "label": "tim",
            "data": [[1317513600000 + 5000000 * 3, "95382"], [1317600000000 + 5000000, "89699"]]
        },
        {
            "label": "britney",
            "data": [[1317513600000 + 5000000 * 4, "76772"]]
        },
        {
            "label": "logan",
            "data": [[1317513600000 + 5000000 * 5, "88674"]]
        }];

                     var options = {
                         series: {
                             bars: {
                                 show: true,
                                 barWidth: 60 * 60 * 1000,
                                 align: 'center'
                             }
                         },
                         points: {
                             show: true
                         },
                         lines: {
                             show: true
                         },
                         grid: { hoverable: true, clickable: true },
                         yaxes: {
                             min: 0
                         },
                         xaxis: {
                             mode: 'time',
                             timeformat: "%b %d",
                             minTickSize: [1, "month"],
                             tickSize: [1, "day"],
                             autoscaleMargin: .10
                         }
                     };

                     $(function () {
                         $.plot($('#placeholder'), data, options);
                     });
                     $(function () {
                         var previousPoint = null;
                         $("#placeholder").bind("plothover", function (event, pos, item) {
                             if (item) {
                                 if (previousPoint != item.datapoint) {
                                     previousPoint = item.datapoint;

                                     $("#tooltip").remove();
                                     var x = item.datapoint[0],
                    y = item.datapoint[1] - item.datapoint[2];
                                     debugger;
                                     showTooltip(item.pageX, item.pageY, y + " " + item.series.label, item.series.color);
                                 }
                             }
                             else {
                                 $("#tooltip").remove();
                                 previousPoint = null;
                             }
                         })
                     });
                 })
                 );
</script>