1. ホーム
  2. Web プログラミング
  3. ジャバスクリプト
  4. javascriptのクラスライブラリ

Vueがechartsのtooltipにクリックイベントを追加するケーススタディ

2022-01-13 12:23:43

要求事項

詳細ページにジャンプするために、echartsのツールチップで学校名をクリックする必要がある。プロジェクトは上海から-->地区 ---->特定の学校(最後のレベルでツールチップのクリックイベントをバインド)。

 このプロジェクトはvueとechartsで実装されており、新しいバージョン(^5.0.2)であるため、クリックイベントをウィンドウにバインドしていない

解決方法

1. ツールチップを設定する

enterable: true, //マウスでチップホバーレイヤーに入ることを許可, triggeron:'click', //チップボックスがトリガーする条件 マウス移動 トリガー クリック トリガー 'mousemove|click' マウス移動とクリックが同時に起こること

tooltip: {
          // prompt box component
          show: true, // Show the tip box component
          trigger: "item", // trigger type
          triggerOn: "mousemove", // start condition
          // formatter: "name:{b}<br/>coordinates:{c}",
          enterable: true, // allow mouse to enter in hover layer
          showContent: true,
          triggerOn: "click", // the condition that the hint box is triggered mousemove when the mouse moves click when the mouse clicks 'mousemove|click' when the mouse moves and clicks at the same time
          // confine: true, // confine toolTip to the area of the chart
          className: "areaTool",
          // hideDelay: 100000, // delay the disappearing time
          formatter: (item) => {
            this.hookToolTip = item;
            // The latitude and longitude are too long and need to intercept the display of the number of digits, keeping seven decimal places
            // need to bind the click event
            var tipHtml = "";
            tipHtml =
              '<div style="width:2.5rem;height:80%;background:rgba(22,80,158,0.8);border:0.0125rem solid rgba(7,166,255,0.7)">' + '<div style="width:2.5rem;height:80%;background:rgba(22,80,158,0.8);border:0.0125rem solid rgba(7,166,255,0.7)">'
              '<div style="width:100%;height:0.375rem;line-height:0.375rem;border-bottom:0.025rem solid rgba(7,166,255,0.7);">' +
              '<i style="display:inline-block;width:0.125rem;height:0.125rem;background:#16d6ff;border-radius:0.5rem;">' +
              "</i>" +
              '<span id="btn-tooltip" style="margin-left:0.125rem;color:#fff;font-size:0.2rem;cursor:pointer">' +   
              item.name +
              "</span>" +
              "</div>" +
              '<div style="padding:0.1875rem;text-align: left;">' +
              '<p style="color:#fff;font-size:0.15rem;">' +
              '<i style="display:inline-block;width:0.1rem;height:0.1rem;background:#16d6ff;border-radius:0.5rem;margin:0 0.1rem"> ' +
              "</i>" +
              "longitude" +
              '<span style="color:#11ee7d;margin:0 0.075rem;">' +
              item.value[0].substr(0, 11) +
              "</span>" +
              "</p>" +
              '<p style="color:#fff;font-size:0.15rem;">' +
              '<i style="display:inline-block;width:0.1rem;height:0.1rem;background:#16d6ff;border-radius:0.5rem;margin:0 0.1rem"> ' +
              "</i>" +
              "lat" +
              '<span style="color:#11ee7d;margin:0 0.075rem;">' +
              item.value[1].substr(0, 11) +
              "</span>" +
              "</p>" +
              '<p style="color:#fff;font-size:0.15rem;">' +
              '<i style="display:inline-block;width:0.1rem;height:0.1rem;background:#16d6ff;border-radius:0.5rem;margin:0 0.1rem"> ' +
              "</i>" +
              "Number of examination rooms" +
              '<span style="color:#11ee7d;margin:0 0.075rem;">' +
              item.componentIndex +
              "</span>" +
              "pcs" +
              "</p>" +
              '<p style="color:#fff;font-size:0.15rem;">' +
              '<i style="display:inline-block;width:0.1rem;height:0.1rem;background:#16d6ff;border-radius:0.5rem;margin:0 0.1rem"> ' +
              "</i>" +
              "invigilator" +
              '<span style="color:#11ee7d;margin:0 0.075rem;">' +
              item.componentIndex +
              "</span>" +
              "pcs" +
              "</p>";

            return tipHtml;
          },
        },

2. hookToolTip 変数の定義

フォーマッターで hookToolTip に値を割り当て、id を追加し、onclick でイベントをバインドするか、addEventListerner でイベントを登録するか、dom 要素をウォッチで検出します。

watch: {
    hookToolTip: {
      handler(newVal, oldVal) {
        console.log(newVal, oldVal, "---------watch");
        let tooltipButton = document.querySelectorAll("#btn-tooltip");
        //register the event by onclick querySelectorAll gets the element as an array
        if (tooltipButton.length > 0) {
          tooltipButton[0].onclick = this.pointNameClick;
        }
        // Register the event via addEventListener
        for (let i = 0; i < tooltipButton.length; i++) {
          tooltipButton[i].addEventListener("click", this.chartClick);
        }
      },
      // immediate: true,
      // deep: true,
    },
  },

3. メソッドにメソッドを追加する

4. フルコード

data(){
       hookToolTip: {},     
},

  watch: {
    hookToolTip: {
      handler(newVal, oldVal) {
        console.log(newVal, oldVal, "---------watch");
        let tooltipButton = document.querySelectorAll("#btn-tooltip");
        //register the event by onclick querySelectorAll gets the element as an array
        if (tooltipButton.length > 0) {
          tooltipButton[0].onclick = this.pointNameClick;
        }
        // Register the event via addEventListener
        for (let i = 0; i < tooltipButton.length; i++) {
          tooltipButton[i].addEventListener("click", this.chartClick);
        }
      },
      // It is not necessary to enter the page to check
      // immediate: true,
      // deep: true,
    },
  },

  methods: {
    chartClick() {
      console.log(
        this.hookToolTip,
        "-------addEventList",
        this.hookToolTip.name
      );
    },
 },

    
/      tooltip: {
          // prompt box component
          show: true, // Show the prompt box component
          trigger: "item", // trigger type
          triggerOn: "mousemove", // start condition
          // formatter: "name:{b}<br/>coordinates:{c}",
          enterable: true, // allow mouse to enter in hover layer
          showContent: true,
          triggerOn: "click", // the condition that the hint box is triggered mousemove when the mouse moves click when the mouse clicks 'mousemove|click' when the mouse moves and clicks at the same time
          // confine: true, // confine toolTip to the area of the chart
          className: "areaTool",
          // hideDelay: 100000, // delay the disappearing time
          formatter: (item) => {
            this.hookToolTip = item;
            console.log(item, "-----", this.hookToolTip);
            // too long latitude and longitude need to intercept the number of digits displayed, retaining seven decimal places
            // need to bind the click event
            var tipHtml = "";
            tipHtml =
              '<div style="width:2.5rem;height:80%;background:rgba(22,80,158,0.8);border:0.0125rem solid rgba(7,166,255,0.7)">' + '<div style="width:2.5rem;height:80%;background:rgba(22,80,158,0.8);border:0.0125rem solid rgba(7,166,255,0.7)">'
              '<div style="width:100%;height:0.375rem;line-height:0.375rem;border-bottom:0.025rem solid rgba(7,166,255,0.7);">' +
              '<i style="display:inline-block;width:0.125rem;height:0.125rem;background:#16d6ff;border-radius:0.5rem;">' +
              "</i>" +
              '<span id="btn-tooltip" style="margin-left:0.125rem;color:#fff;font-size:0.2rem;cursor:pointer" onclick=" chartClick">' +
              item.name +
              "</span>" +
              "</div>" +
              '<div style="padding:0.1875rem;text-align: left;">' +
              '<p style="color:#fff;font-size:0.15rem;">' +
              '<i style="display:inline-block;width:0.1rem;height:0.1rem;background:#16d6ff;border-radius:0.5rem;margin:0 0.1rem"> ' +
              "</i>" +
              "longitude" +
              '<span style="color:#11ee7d;margin:0 0.075rem;">' +
              item.value[0].substr(0, 11) +
              "</span>" +
              "</p>" +
              '<p style="color:#fff;font-size:0.15rem;">' +
              '<i style="display:inline-block;width:0.1rem;height:0.1rem;background:#16d6ff;border-radius:0.5rem;margin:0 0.1rem"> ' +
              "</i>" +
              "lat" +
              '<span style="color:#11ee7d;margin:0 0.075rem;">' +
              item.value[1].substr(0, 11) +
              "</span>" +
              "</p>" +
              '<p style="color:#fff;font-size:0.15rem;">' +
              '<i style="display:inline-block;width:0.1rem;height:0.1rem;background:#16d6ff;border-radius:0.5rem;margin:0 0.1rem"> ' +
              "</i>" +
              "Number of examination rooms" +
              '<span style="color:#11ee7d;margin:0 0.075rem;">' +
              item.componentIndex +
              "</span>" +
              "pcs" +
              "</p>" +
              '<p style="color:#fff;font-size:0.15rem;">' +