- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在我的网络应用程序中使用谷歌散点图,它加载到文档就绪。我最近做了一些重组,并试图将页面内容划分到不同的 Bootstrap 选项卡中。
如果我在事件选项卡 Pane 上加载图形,它工作正常并且图形的宽度、高度参数是正确的。但是,如果我将图形移动到隐藏选项卡,则图形无法使用传递给函数的参数(特别是宽度和高度)正确加载。目前我正在调用文档准备好的图表。
这是我的代码
HTML
<div class="layout layout-stack-sm layout-main-right">
<div class="col-sm-3 layout-sidebar">
<div class="col-sm-12">
<ul id="myTab" class="nav nav-layout-sidebar nav-stacked">
<li class="active">
<a href="#quick-stats" data-toggle="tab">
<i class="fa fa-th"></i>
Quick Stats
</a>
</li>
<li>
<a href="#engagement-graph" data-toggle="tab">
<i class="fa fa-bar-chart-o"></i>
Engagement graph
</a>
</li>
</ul>
</div>
</div> <!-- layout sidebar -->
<div class="col-sm-9 layout-main">
<div class="tab-content stacked-content">
<div class="tab-pane fade in active" id="quick-stats">
Some content
</div>
<div class="tab-pane fade" id="engagement-graph">
<div id="myMoodPage">
<div class="graph" id="graph">
</div>
</div>
</div>
</div>
</div>
在文档就绪时加载图表
<script type="text/javascript" src="https://www.google.com/jsapi">
</script>
<script type="text/javascript">
google.load("visualization", "1", {packages: ["corechart"]});
$(document).ready(function () {
$('#myMoodPage').myMood({
graphDataUrl: '<?php echo $this->url('my_mood/mood_graph_data'); ?>',
graphData: <?php echo $graphData; ?>,
titles: ['<?php echo $this->translate('time'); ?>', '<?php echo $this->translate('mood'); ?>', '<?php echo $this->translate('avg'); ?>']
});
});
function updatePageCharts() {
$('#myMoodPage').myMood('loadGraph');
}
$("a[href='#engagement-graph']").on('shown.bs.tab', function (e) {
google.load('visualization', '1', {
packages: ['corechart'],
callback: drawChart
});
});
</script>
这是我的主要 JS 文件,我在其中定义图形参数和其他内容(实际上与这个问题无关,但为了完整起见,我发布了整个函数)
(function ($) {
$.widget("ui.myMood", {
options: {
graphDataUrl: "",
graphData: {},
titles: ["time", "mood", "avg"]
},
_create: function () {
var self = this;
this.periodSelect = this.element.find('select[name="period"]');
this.questionSelect = this.element.find('select[name="question"]');
this.graphContainer = this.element.find(".statistics");
this.atStart = this.element.find("#atStart .value");
this.highest = this.element.find("#highest .value");
this.lowest = this.element.find("#lowest .value");
this.current = this.element.find("#current .value");
this.last30 = this.element.find("#last30 .value");
this.last30Trend = this.element.find("#last30");
this.week = this.element.find("#week .value");
this.weekTrend = this.element.find("#week");
this.graphId = "graph";
this.selectedFilterName = this.options.titles[2];
this.periodSelect.change(function () {
self.loadGraph()
});
this.questionSelect.change(function () {
self.loadGraph();
self.selectedFilterName = self.questionSelect.find("option:selected").text()
});
this.setGraphData(this.options.graphData);
return this
},
loadGraph: function () {
var self = this;
var data = {
period: self.periodSelect.val(),
question: self.questionSelect.val()
};
var success = function (data) {
self.setGraphData(data)
};
$.ajax({
type: "POST",
url: self.options.graphDataUrl,
data: data,
success: success
})
},
setGraphData: function (data) {
var self = this;
this.atStart.text(data.atStart);
this.highest.text(data.highest);
this.lowest.text(data.lowest);
this.current.text(data.current);
this.last30.text(data.last30.val);
this.last30Trend.find(".up, .down").hide();
this.last30Trend.removeClass("incr");
this.last30Trend.removeClass("decr");
if (Number(data.last30.trend) > 0) {
this.last30Trend.find(".up").show();
this.last30Trend.addClass("incr")
}
if (Number(data.last30.trend) < 0) {
this.last30Trend.find(".down").show();
this.last30Trend.addClass("decr")
}
this.week.text(data.week.val);
this.weekTrend.find(".up, .down").hide();
this.weekTrend.removeClass("incr");
this.weekTrend.removeClass("decr");
if (Number(data.week.trend) > 0) {
this.weekTrend.find(".up").show();
this.weekTrend.addClass("incr")
}
if (Number(data.week.trend) < 0) {
this.weekTrend.find(".down").show();
this.weekTrend.addClass("decr")
}
var moodData = data.mood;
var dataArray = new Array();
for (i in moodData) {
if (moodData[i].avg == null) {
moodData[i].avg = undefined
}
if (moodData[i].mood == null) {
moodData[i].mood = undefined
}
if (moodData[i].team == null) {
moodData[i].team = undefined
}
var moodText = '<div style="border-radius: 2px; padding: 10px; color: #ffffff; font-weight: bold; background-color: #9c3b8a;">';
if (moodData[i].event != null) {
moodText += moodData[i].event + " "
}
moodText += moodData[i].mood;
if (moodData[i].comment) {
moodText += "<br>" + moodData[i].comment
}
moodText += "</div>";
var avgText = '<div style="border-radius: 2px; padding: 10px; color: #ffffff; font-weight: bold; background-color: #15426c;">';
if (moodData[i].event != null) {
avgText += moodData[i].event + " "
}
avgText += moodData[i].avg;
if (moodData[i].publicComment) {
avgText += "<br>" + moodData[i].publicComment
}
avgText += "</div>";
var row = [new Date(moodData[i].time * 1000), Number(moodData[i].mood), moodText, Number(moodData[i].avg), avgText, false];
dataArray.push(row)
}
if (google) {
drawChart()
} else {
google.setOnLoadCallback(drawChart)
}
function drawChart() {
var dataTable = new google.visualization.DataTable();
dataTable.addColumn("date", self.options.titles[0]);
dataTable.addColumn("number", self.options.titles[1]);
dataTable.addColumn({
type: "string",
role: "tooltip",
p: {
html: true
}
});
dataTable.addColumn("number", self.selectedFilterName);
dataTable.addColumn({
type: "string",
role: "tooltip",
p: {
html: true
}
});
dataTable.addColumn({
type: "boolean",
role: "certainty"
});
dataTable.addRows(dataArray);
var dataView = new google.visualization.DataView(dataTable);
var chart = new google.visualization.ScatterChart(document.getElementById(self.graphId));
var options = {
legend: {
position: "bottom"
},
interpolateNulls: true,
chartArea: {
left: 25,
top: 25,
width: '92%',
height: '80%'
},
backgroundColor: "#ffffff",
vAxis: {
minValue: 0,
maxValue: 6,
viewWindow: {
min: 0,
max: 6
}
},
tooltip: {
isHtml: true
},
series: {
0: {
color: "#9c3b8a",
lineWidth: 2,
pointSize: 6
},
1: {
color: "#15426c",
lineWidth: 1,
pointSize: 3
}
}
};
chart.draw(dataView, options)
}
}
})
})(jQuery);
我试过像这样重新加载图表,但没有成功
$("a[href='#engagement-graph']").on('shown.bs.tab', function (e) {
google.load('visualization', '1', {
packages: ['corechart'],
callback: drawChart
});
});
两种不同情况下的截图
在事件选项卡 Pane 上加载
在隐藏的选项卡 Pane 上加载
最佳答案
在隐藏的 div 中绘制图表(这通常是标签界面的实现方式)破坏了 Visualization API 中的维度检测算法,这就是为什么在除开始时打开的标签之外的任何标签中绘制图表时图表绘制奇怪的原因。
您只能加载一次 API; Visualization API 对 google.load
的后续调用将被忽略,这就是为什么您的“shown.bs.tab”事件处理程序没有执行您想要的操作。
由于将选项卡初始化延迟到图表绘制之后对于 Bootstrap 来说并不是真正可行的选择,因此我建议替换此代码:
google.load("visualization", "1", {packages: ["corechart"]});
$("a[href='#engagement-graph']").on('shown.bs.tab', function (e) {
google.load('visualization', '1', {
packages: ['corechart'],
callback: drawChart
});
});
用这个:
function init () {
if (/* boolean expression teting if chart tab is open */) {
drawChart();
}
else {
$("a[href='#engagement-graph']").one('shown.bs.tab', drawChart);
}
}
google.load("visualization", "1", {packages: ["corechart"], callback: init});
如果容器选项卡打开,这应该绘制图表,如果选项卡未打开,则创建一个一次性事件处理程序,在第一次打开选项卡时绘制图表。
您需要将此代码放在 setGraphData
函数中以避免数据加载时出现竞争条件,因此 drawChart
函数将在范围内。此外,删除这些行:
if (google) {
drawChart()
} else {
google.setOnLoadCallback(drawChart)
}
google
对象在 jsapi
的脚本标签加载后就存在,这将是在执行此代码之前,因此您将始终触发 drawChart
函数在这里。然而,google
对象可用并不意味着可视化 API 已加载。
关于javascript - 在隐藏的 Bootstrap 选项卡 Pane 上重绘谷歌图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932363/
我正在尝试设置一个具有三个分割 Pane 的用户界面。前两个是垂直 Pane ,位于屏幕的左侧和右侧。每个拆分的一侧都有一个标题 Pane 。用户可以从这些 Pane 中选择项目以包含在中央 Pane
我经常使用 SQL Server Management Studio,并且始终使用以下 Pane 来处理数据:图表、条件和 SQL。 SQL Panes that I always use 目前,我每
可能是一个有点愚蠢的问题。问题很简单,我倾向于有两个 Pane ,一个用于编写代码,另一个用于编译它。我用 windows 终端 (cmd + vim + Mingw) 做到了这一点,但有些事情困扰着
我想出了如何使用 the Working with Map Panes tutorial 在自定义 Pane 中创建多边形和 this Stack Overflow question及其相关的 Fid
如何将输出连接到 paneWithList? PaneWithList 在其 JList 上有一个监听器,以便将所选行输出到控制台。如何将该输出定向到输出上的 JTextPane? PaneWithL
横向和纵向不同布局之间的方向变化似乎很容易,但是我找不到适合我当前情况的解决方案。 我想在横向模式下使用带有两个 fragment 的双 Pane 布局 res\layout-land\dashboa
我在Xcode中使用Swift编程时,当我想使用实用程序 Pane 编辑按钮时,我意识到它变成了“不适用”。属性检查器,连接检查器等全部变为“不适用”,仅快速帮助检查器仍显示。 我已选择 Storyb
我正在 JavaFX 中编写 vector Canvas ( vector 图形, Canvas 上仅显示形状):好吧,这样您就可以四处移动并放大它。 由于翻译时节点左上角的位置发生变化,并且不再响应
我有一个带有中心 Pane 的边框 Pane - VBox。VBox 包含一个 GridPane 和一个 VBox Pane 。 垂直框(垂直框内的垂直框)最初设置为不可见。 我想要做的是,如果将 G
我正在 JavaFX 中编写 vector Canvas ( vector 图形, Canvas 上仅显示形状):好吧,这样您就可以四处移动并放大它。 由于翻译时节点左上角的位置发生变化,并且不再响应
简单地说,我想让 java 做我想做的事情,但我无法理解布局管理中的任何其他自动调整大小到它感觉要做的事情。 我想要的是一个固定高度的“页脚”和顶部“主”区域,以根据窗口的高度自动调整大小。 水平方向
我尝试创建一个在堆栈 Pane 中包含 2 个 Pane 的应用程序。一个 Pane 是主 Pane 并居中,第二个 Pane 较小并停靠在舞台的左下角。 问题是我试过使用“setAlignment”
我已经在我的第一个 android 应用程序中实现了滑动 Pane 布局,但是当我滑动菜单时,操作栏仍然保持静态,我想实现像 Google+ 应用程序那样的东西 在 Stack Overflow 中也
我只是 Java 的初学者。这是我的问题: 我用这段代码创建了一个可滚动的文本字段(1): jZone_Text = new JTextPane(); scrollPane = new JScroll
我在左 Pane 中创建了一个文件夹,其中包含各种图像。它被称为“wikiImages”。如何访问此文件夹或获取此文件夹的路径? 我找到了 Bundle.main.resourcePath!,但这似乎
好吧,我是 JavaFx 的新手,而且我已经很长时间没有使用 Java 了,所以我遇到了很多问题。最大的问题是如何更改该死的 Pane 的背景。 下面是Controller类 //Styling pr
我正在使用 JavaFX 编写一个程序,其中我有 边框 Pane -> 中心 -> VBox -> 滚动 Pane -> 网格 Pane 我希望能够向网格 Pane 添加任意多的行,并让滚动 Pane
我已经尝试使这项工作 2 天了,并且阅读了许多示例和堆栈溢出问题。我是 html 和 css 的新手,这是我的第 3 天。对于我做错了什么的任何提示或见解,以及一般性评论或批评,我们将不胜感激。 我试
我有一个位于另一个 Pane 内的可拖动 Pane 。我想让子 Pane 只能在父 Pane 的边界内拖动,但默认情况下,子 Pane 可以拖动到任何地方。如何解决这个问题。 最佳答案 看看这个dem
我现在正在学习基本的 JavaFX,我不明白我正在阅读的书中的这句话:“不,像文本字段这样的节点只能添加到一个 Pane 中一次。添加一个节点多次或不同的 Pane 将导致运行时错误。”从书上提供的U
我是一名优秀的程序员,十分优秀!