창 크기 조정시 Google 차트 다시 그리기 / 크기 조정


답변:


68

창 크기 조정이 완료되었을 때만 다시 그리고 여러 트리거를 피하려면 이벤트를 만드는 것이 좋습니다.

//create trigger to resizeEnd event     
$(window).resize(function() {
    if(this.resizeTO) clearTimeout(this.resizeTO);
    this.resizeTO = setTimeout(function() {
        $(this).trigger('resizeEnd');
    }, 500);
});

//redraw graph when window resize is completed  
$(window).on('resizeEnd', function() {
    drawChart(data);
});

40

Google의 원래 코드는 단순히 마지막에 다음을 수행합니다.

var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);

약간의 자바 스크립트로 변경하면 창 크기가 조정될 때 크기를 조정할 수 있습니다.

function resize () {
    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
    chart.draw(data, options);
}

window.onload = resize;
window.onresize = resize;

25
ajax를 통해 "데이터"를 가져올 때 모든 창 크기 조정 '단계'에서 XHTTPRequest를 트리거하는 것은 서버에서 약간의 스트레스가 될 수 있다는 것을 언급 할 가치가 있습니다. 그 데이터를 재사용하지만 귀하의 솔루션은 저에게 효과적입니다! +1
Michiel Cornille 2013 년

1
나를 위해 일하지 않았고 다시 그리기 전에 div에서 오래된 rezults를 삭제해야했습니다. $ ( '# chart_div'). empty ();
Mantas D

3
window.onload = resize();동등하다resize(); window.onload = undefined;
구스타보 로드리게스

창을 더 크게 만들 때 설명하는대로 작동하지만 창을 축소하면 Mantas D가 지적했듯이 먼저 차트 div를 비워야합니다. $ ( '# chart_div'). empty (); 이렇게하면 차트를 다시 그리기 전에 브라우저가 div를 축소 할 수 있습니다.
Vincent

이 솔루션이 마음에 듭니다. 클라이언트 측의 타이머 또는 재귀 함수가 마음에 들지 않습니다. 왜 CPU 성능을 지속적으로 사용합니까?
Roberto

8

window.resize이벤트가 각 크기 조정 이벤트에서 여러 번 발생 하기 때문에 가장 좋은 해결책은 smartresize.js 를 사용하고 smartdraw(). 이는 당 차트 다시 그리기 수를 제한합니다 window.resize.

제공된 js를 사용하면 다음과 같이 간단하게 수행 할 수 있습니다.

// Instantiate and draw our user charts, passing in some options (as you probably were doing it)
var chart = new google.visualization.LineChart(document.getElementById('div_chart'));
chart.draw(data, options);

// And then:
$(window).smartresize(function () {
    chart.draw(data, options);
});

맞춤법 오류 "otions"-> "options"
Tomasz Majerski

4

이것은 브라우저에 너무 많은 스트레스를주지 않고이 작업을 수행 할 수있는 가장 간단한 방법입니다.

    var chart1 = "done";

$(window).resize(function() {
if(chart1=="done"){
chart1 = "waiting";
setTimeout(function(){drawChart();chart1 = "done"},1000);
}
});

차트가 다시로드되기 전에 1 초만 기다리면이 대기 기간에 함수가 다시 호출되지 않습니다. 창 크기 조정 함수는 창 크기를 변경할 때마다 여러 번 호출되므로 창 크기를 변경할 때마다 함수가 실제로 한 번만 작동하도록하고 나머지 호출은 if 문에 의해 중지됩니다.

이게 도움이 되길 바란다


단순성에 탁월합니다.
MastaBaba 2015

3

Google Visualization API에는 Google 차트를 반응 형으로 만드는 옵션이 없습니다.

그러나 Google 차트를 Window Resizes로 반응 형으로 만들 수 있습니다 . Google Chart를 반응 형으로 만들기 위해 GitHub 에서 사용할 수있는 jQuery 라이브러리가 있습니다. jquery-smartresize 는 창 크기 조정 이벤트에서 그래프 크기를 조정할 수있는 기능이있는 MIT 라이센스에 따라 라이센스를 받았습니다.

GitHub의이 프로젝트에는 두 개의 스크립트 파일이 있습니다.

jquery.debouncedresize.js: adds a special event that fires once after the window
has been resized.

&

jquery.throttledresize.js: adds a special event that fires at a reduced rate (no 
more double events from Chrome and Safari).

다음은 반응 형 차트의 두 가지 예입니다 .

  1. 반응 형 Google 파이 차트
  2. 반응 형 Google 막대 차트

원하는 차트 종횡비와 일치하도록 시각화 랩의 하단 패딩을 변경할 수 있습니다.

Calculate as Height / Width x 100
For a 16x9 display it would be 9/16 = 0.5625 x 100 = 56.25%
For a square it'd be 100%

크기 조정시 레이블이 잘리지 않도록 Google Chart의 chartarea 옵션을 사용자 정의 할 수 있습니다 .


2

창 크기 조정시 Google 라인 차트를 다시 그리거나 크기를 다시 조정합니다.

$(document).ready(function () {
    $(window).resize(function(){
        drawChart();
    });
});

chart.draw (data, options); 호출하기 만하면되므로 정말 비효율적입니다. 다시. 이것은 모든 정보를 가져오고 반복적이고 불필요한 작업을 수행합니다.
Fonsini 2013

클릭시 다시 그리기 예제를 강제하는 방법 크기 조정 기능을 강제로 호출합니다.
MaXi32

1

addEventListener를 사용하여 살 수 있고 IE <9에 대한 지원 부족에 신경 쓰지 않는다면 개인적으로 다음 접근 방식을 선호합니다.

var windowResizeTimer;
window.addEventListener('resize', function(e){
    clearTimeout(windowResizeTimer);
    windowResizeTimer = setTimeout(function(){
        chart.draw(data, options);
    }, 750);
});

setTimeout()clearTimeout()함수 의 사용 과 750 밀리 초의 추가 된 지연은 여러 크기 조정 이벤트가 빠르게 연속적으로 실행될 때 약간 덜 집중적으로 만듭니다 (마우스를 사용하여 크기를 조정할 때 데스크톱의 브라우저에서 자주 발생 함).


0

나는 며칠 동안 같은 일에 매달 렸고 이벤트를 추가하는 것이 가장 효과적이라는 것을 알았습니다.

window.addEventListener("resize", drawChart);

함수를 선언 한 후이 줄을 추가하면 제대로 작동합니다.

drawChart를 함수 이름으로 바꿉니다.


-1

Tiago Castro의 답변을 사용 하여 데모를 보여주기 위해 선 차트 를 구현했습니다 .

google.load('visualization', '1', {
  packages: ['corechart', 'line']
});
google.setOnLoadCallback(drawBackgroundColor);

function drawBackgroundColor() {
  var data = new google.visualization.DataTable();
  data.addColumn('number', 'X');
  data.addColumn('number', 'Compute Time');
  data.addColumn('number', 'Compute Times');
  console.log("--");
  data.addRows([
    [0, 0, 0],
    [10, 10, 15],
    [20, 20, 65]
  ]);
  console.log(data);
  var options = {
    height: 350,
    legend: {
      position: 'bottom'
    },
    hAxis: {
      title: 'Nb Curves'
    },
    vAxis: {
      title: 'Time (ms)'
    },
    backgroundColor: '#f1f8e9'
  };

  function resize() {
    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
    chart.draw(data, options);
  }
  window.onload = resize();
  window.onresize = resize;

}
<script src='https://www.google.com/jsapi'></script>
<div id="chart_div">

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.