Highcharts Graph仅在Window Resize上正确显示

时间:2014-01-30 13:21:43

标签: javascript ruby-on-rails highcharts window-resize

在我的rails应用程序中,我有一个highcharts图形,它显示在一个模态对话框中,当加载模态对话框时;图形占据整个框(不正确),但是当我调整窗口大小时;图形调整到适当的大小,就像应该的那样。

这是首次加载时图表的外观 - > [链接] [1](错误) 这是图表在调整窗口大小后的样子 - > [链接] [2](正确)

如何获取图表以便在第一次加载时正确显示图表,而不是在窗口调整大小后显示?

以下是该部分页面的代码:

- player_url = URI.encode('http://'+request.host_with_port + player.url)
- player_title = "AmericanSoccerNow: #{player.title}"
- player_description = player.dek

- highchart_data = @asns.map { |asn| [asn.asn_month.try(:strftime, '%b/%y'), asn.player_rank(player)] }
- highchart_xaxis_data = @asns.collect { |asn| asn.asn_month.try(:strftime, '%b-%y')}


.detail
  / :javascript
  /   alert( 'You are running jQuery version: ' + $.fn.jquery );
  .left
    - if player.hero_image and player.hero_image.attached
      = image_tag player.hero_image.attached.url, :height => "auto", :width => "100%"
      %span.imageCaption
        = player.hero_image.credit.try(:html_safe)
      .block
        #contain{:style => "width: 100%; height: auto; "}
        :javascript
          $(function() {
            $('#contain').highcharts({
                chart: {
                    spacingLeft: 0
                },
                title: {
                  text: 'ASN 100 Ranking Tracker',
                    style: {
                      color: 'black',
                      font: 'normal 12px "Alfa Slab One", Helvetica, Arial, sans-serif',
                    }
                },
                xAxis: {
                  categories: #{raw highchart_xaxis_data.to_json},
                  labels: {
                    lineColor: 'red',
                    lineWidth: 2,
                    enabled: true,
                    style: {
                        color: 'black',
                        font: 'normal 10px "Arial", sans-serif',
                    }
                  },
                },
                yAxis: {
                    reversed: true,
                    opposite: true,
                    gridLineColor: 'black',
                    lineColor: 'black',
                    lineWidth: 1,
                    title: {
                      text: '',
                      style: {
                        color: 'red',
                        fontWeight: 'bold'
                      }
                    },
                    plotLines: [{
                      value: 0,
                      width: 1,
                      color: '#808080'
                    }]
                },
                legend: {
                  layout: 'vertical',
                  align: 'right',
                  verticalAlign: 'middle',
                  borderWidth: 0
                },
                credits: {
                  enabled: false,
                },
                series: [{
                  showInLegend: false,
                  name: "#{player.title}'s Rank",
                  color: 'red',
                  data: #{raw highchart_data.to_json}
                }]
            });
          });

    - else 
      = image_tag "http://placehold.it/200x240", :height => 240, :width => 250
    - unless player.relatables.external_videos.empty?
      - player.relatables.external_videos.each do |video|
        .block
          = image_tag video.preview_image, :class => 'video_preview', :width => "100%", :height => "auto", :data => {'youtube-id' => video.youtube_id, :player_id => player.slug, :player_rank => @rank}
          .video_embed{:style => 'display:none;', :data => {'youtube-id' => video.youtube_id}}
            = video.movie_embed.html_safe
          %p.meta
            = video.title

    #secretSocial
    %ul.socialIcons
      = render '/shared/player_addthis', :url => player_url, :title => player_title, :description => player_description, :show_print => true

  .right.arct
    %h2.player
      - unless @rank.nil?
        %span.red
          = "##{@rank}"
      = player.title

    %ul
      %li
        %span
          DOB
        = player.birth_date.try(:strftime, '%B %e, %Y')
      %li
        %span
          Age
        = player.age
      - if player.birth_place.present?
        %li
          %span
            Place of birth
          = player.birth_place
      %li
        %span POSITION
        = player.human_readable_position
      %li
        %span HEIGHT 
        = display_feet(player.height)
      %li
        %span WEIGHT
        = player.weight
      %li
        %span U.S. CAPS
        = player.us_caps
      - if player.club.present?
        %li
          %span CLUB
          = player.club.name
      - if player.twitter_handle.present?
        %li
          %span
            TWITTER
          = link_to "@#{player.twitter_handle}", "http://twitter.com/#{player.twitter_handle}", :target => '_blank'
          = "(#{humanize_twitter_followers(player.twitter_followers)} followers)"
      / - @asns.each do |asn|
      /   - if rank = asn.player_rank(player)
      /     - if rank > 100
      /       - ranking = 'unranked in the top 100'
      /     - else
      /       - ranking = "ranked #{rank}"
      /   - else
      /     - ranking = 'unranked'
      /   %li
      /     %span= "#{asn.asn_month.strftime('%b %Y')}: #{ranking}" 
      - if @current_rank or @previous_rank
        %li
          %span Current ASN 100 Rank
          = (@current_rank.nil? or @current_rank > 100) ? "Unranked" : @current_rank
        %li
          %span Previous ASN 100 Rank
          = (@previous_rank.nil? or @previous_rank > 100) ? "Unranked" : @previous_rank 
      - if player.youth_experience.present?
        %li
          %span Youth Experience
          = player.youth_experience
      - if player.contract_status.present?
        %li
          %span Contract Status
          = player.contract_status
      - if player.questionnaire.present?
        %li
          %span ASN QUESTIONNAIRE
          = link_to "Read now", player.questionnaire.url

    = player.body.try(:html_safe)

    - unless player.relatables.external_links.empty?
      %h4 Noteworthy Reads
      - player.relatables.external_links.each do |external_link|
        = link_to external_link.title, external_link.url, :target => '_blank'
        %br

  .clear

我真的无法弄清楚发生了什么!!!

嘿伙计们我明白了,这就是我为解决它而做的事情:

#contain{:style => "width: 100%; height: auto; "}
    :javascript
      $(function() {
        var initializeChart = function() {
          $('#contain').highcharts({
            chart: {
                spacingLeft: 0,
                events: {
                  load: function() {
                    $(window).resize();
                  }
                }
            },
            title: {
              text: 'ASN 100 Ranking Tracker',
                style: {
                  color: 'black',
                  font: 'normal 12px "Alfa Slab One", Helvetica, Arial, sans-serif',
                }
            },
            xAxis: {
              categories: #{raw highchart_xaxis_data.to_json},
              labels: {
                lineColor: 'red',
                lineWidth: 2,
                enabled: true,
                style: {
                    color: 'black',
                    font: 'normal 10px "Arial", sans-serif',
                }
              },
            },
            yAxis: {
                reversed: true,
                opposite: true,
                gridLineColor: 'black',
                lineColor: 'black',
                lineWidth: 1,
                title: {
                  text: '',
                  style: {
                    color: 'red',
                    fontWeight: 'bold'
                  }
                },
                plotLines: [{
                  value: 0,
                  width: 1,
                  color: '#808080'
                }]
            },
            legend: {
              layout: 'vertical',
              align: 'right',
              verticalAlign: 'middle',
              borderWidth: 0
            },
            credits: {
              enabled: false,
            },
            series: [{
              showInLegend: false,
              name: "#{player.title}'s Rank",
              color: 'red',
              data: #{raw highchart_data.to_json}
            }]
          })
        };

        window.setTimeout(initializeChart, 200);
      });

如果您有疑问,请与我们联系

2 个答案:

答案 0 :(得分:3)

这是我为响应性地开展工作所做的工作:

#contain{:style => "width: 100%; height: auto; "}
    :javascript
      $(function() {
        var initializeChart = function() {
          $('#contain').highcharts({
            chart: {
                spacingLeft: 0,
                events: {
                  load: function() {
                    $(window).resize();
                  }
                }
            },
            title: {
              text: 'ASN 100 Ranking Tracker',
                style: {
                  color: 'black',
                  font: 'normal 12px "Alfa Slab One", Helvetica, Arial, sans-serif',
                }
            },
            xAxis: {
              categories: #{raw highchart_xaxis_data.to_json},
              labels: {
                lineColor: 'red',
                lineWidth: 2,
                enabled: true,
                style: {
                    color: 'black',
                    font: 'normal 10px "Arial", sans-serif',
                }
              },
            },
            yAxis: {
                reversed: true,
                opposite: true,
                gridLineColor: 'black',
                lineColor: 'black',
                lineWidth: 1,
                title: {
                  text: '',
                  style: {
                    color: 'red',
                    fontWeight: 'bold'
                  }
                },
                plotLines: [{
                  value: 0,
                  width: 1,
                  color: '#808080'
                }]
            },
            legend: {
              layout: 'vertical',
              align: 'right',
              verticalAlign: 'middle',
              borderWidth: 0
            },
            credits: {
              enabled: false,
            },
            series: [{
              showInLegend: false,
              name: "#{player.title}'s Rank",
              color: 'red',
              data: #{raw highchart_data.to_json}
            }]
          })
        };

        window.setTimeout(initializeChart, 200);
      });

我在setTimeout方法中添加了,我还在window.resize方法中添加了。

谢谢!

答案 1 :(得分:2)

而不是任意等待200ms,将图表初始化放在window负载上就足够了:

$(window).load(initializeChart);

当文档准备就绪时,$('#contain').width()可能没有您期望的值,但它们都应该在window次加载时设置。