hqchart
Version:
HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接
691 lines (578 loc) • 18.5 kB
JavaScript
/*
Copyright (c) 2018 jones
http://www.apache.org/licenses/LICENSE-2.0
开源项目 https://github.com/jones2000/HQChart
jones_2000@163.com
股票列表 (H5版本)
*/
//单元个类型
var CELL_TYPE_ID=
{
CELL_NONE_ID:0,
CELL_INTEGER_ID:1, //整型
CELL_STRING_ID:2,
CELL_STOCK_NAME_ID:3, //股票名称
CELL_STOCK_CODE_ID:4, //股票代码
CELL_STOCK_PRICE_ID:5, //价格字段
CELL_PERCENTAGE_ID:6, //百分比
CELL_BIG_NUMBER_ID:7, //大数值数据
CELL_DOUBLE_ID:8, //浮点型
}
//表头单元类型
var HEAD_CELL_TYPE_ID=
{
CELL_STRING_ID:2, //字符串
CELL_SELECT_ID:5 //下拉选择框
};
//行数据
function JsCellItem()
{
this.Type=CELL_TYPE_ID.CELL_STRING_ID; //0=数值 1=字符串
this.Value=null; //原始数值
this.Text=''; //显示文本
this.CSS; //对应css样式的名字
this.Element; //td
this.UpdateStatus={ Value:false, CSS:false }; //是否需要更新
this.Index;
this.Build=function(index, trElement)
{
this.Index=index;
if (index<trElement.cells.length)
{
if (this.Element!=trElement.cells[index])
{
this.Element=trElement.cells[index];
this.UpdateStatus={ Value:true, CSS:true };
}
}
else
{
this.Element=trElement.insertCell(index);
this.UpdateStatus={ Value:true, CSS:true };
}
this.Update();
}
this.Update=function()
{
if (!this.Element) return;
if (this.UpdateStatus.Value==true) this.Element.innerHTML=this.Text;
if (this.UpdateStatus.CSS==true) this.Element.className=this.CSS;
this.UpdateStatus.Value=false;
this.UpdateStatus.CSS=false;
}
this.SetValue=function(value, option) //option: { Type:单元个类型}
{
if (!option || !option.Type) this.SetStringValue(value.toString());
switch(option.Type)
{
case CELL_TYPE_ID.CELL_STOCK_NAME_ID:
case CELL_TYPE_ID.CELL_STOCK_CODE_ID:
this.SetStringValue(value,option);
break;
case CELL_TYPE_ID.CELL_STOCK_PRICE_ID:
this.SetPriceValue(value,option);
break;
case CELL_TYPE_ID.CELL_PERCENTAGE_ID:
this.SetPercentageValue(value,option);
break;
case CELL_TYPE_ID.CELL_BIG_NUMBER_ID:
this.SetBigNumberValue(value,option);
break;
case CELL_TYPE_ID.CELL_NONE_ID:
this.SetNoneValue(value,option);
break;
case CELL_TYPE_ID.CELL_DOUBLE_ID:
this.SetDoubleValue(value,option)
break;
case CELL_TYPE_ID.CELL_INTEGER_ID:
this.SetIntegerValue(value,option);
break;
}
}
this.ChangeType=function(option)
{
if (!opton) return;
var value=this.Value; //先读取值
this.SetValue(value,option);
}
this.SetPercentageValue=function(value, option)
{
this.Value=value;
if (JSTableHelper.IsNumber(value)) this.SetText(value.toFixed(option.Dec)+'%');
else this.SetText(option.NullText);
if (value>option.CompareValue) this.SetCSS(option.CSS[0]);
else if (value<option.CompareValue) this.SetCSS(option.CSS[1]);
else this.SetCSS(option.CSS[2]);
}
this.SetPriceValue=function(value, option)
{
if (value==this.Value) return;
this.Value=value;
if (!JSTableHelper.IsNumber(value)) this.SetText(option.NullText);
else this.SetText(value.toFixed(option.Dec));
if (value>option.CompareValue) this.SetCSS(option.CSS[0]);
else if (value<option.CompareValue) this.SetCSS(option.CSS[1]);
else this.SetCSS(option.CSS[2]);
}
this.SetBigNumberValue=function(value, option)
{
this.Value=value;
this.SetText(JSTableHelper.FormatValueString(value,option.Dec[0],option.Dec[1]));
this.UpdateStatus.Value=true;
this.SetOption(option);
}
this.SetDoubleValue=function(value, option)
{
this.Type=CELL_TYPE_ID.CELL_DOUBLE_ID;
this.Value=value;
if (JSTableHelper.IsNumber(value)) this.SetText(value.toFixed(opton.Dec)); //TO:格式化类
else this.SetText(option.NullText);
this.UpdateStatus.Value=true;
this.SetOption(option);
}
this.SetIntegerValue=function(value,option)
{
this.Type=CELL_TYPE_ID.CELL_INTEGER_ID;
this.Value=value;
if (JSTableHelper.IsNumber(value)) this.SetText(parseInt(value).toString()); //TO:格式化类
else this.SetText(option.NullText);
this.SetOption(option);
}
this.SetNoneValue=function(value,option)
{
this.Type=CELL_TYPE_ID.CELL_NONE_ID;
this.Value=value;
this.SetText(opton.NullText);
this.SetOption(option);
}
this.SetStringValue=function(value, option)
{
this.Type=CELL_TYPE_ID.CELL_STRING_ID;
this.Value=value;
this.SetText(value);
this.SetOption(option);
}
this.SetCSS=function(css)
{
if (!css) return;
if (css!=this.CSS)
{
this.CSS=css;
this.UpdateStatus.CSS=true;
}
}
this.SetType=function(type)
{
if (JSTableHelper.IsNumber(type)) this.Type=type;
}
this.SetText=function(text)
{
if (this.Text!=text)
{
this.Text=text;
this.UpdateStatus.Value=true;
}
}
this.SetOption=function(option)
{
if (!option) return;
this.SetCSS(option.CSS);
this.SetType(option.Type);
}
}
JsCellItem.GetCellRule=function(type)
{
const CELL_RULE_MAP=new Map
([
[CELL_TYPE_ID.CELL_STOCK_NAME_ID, {Type:CELL_TYPE_ID.CELL_STOCK_NAME_ID, CSS:'jscell-stock-name'} ],
[CELL_TYPE_ID.CELL_STOCK_CODE_ID, {Type:CELL_TYPE_ID.CELL_STOCK_CODE_ID, CSS:'jscell-stock-code'} ],
[CELL_TYPE_ID.CELL_NONE_ID, {Type:CELL_TYPE_ID.CELL_NONE_ID, CSS:'jscell-none', NullText:''}],
[CELL_TYPE_ID.CELL_PERCENTAGE_ID,
{
Type:CELL_TYPE_ID.CELL_PERCENTAGE_ID,
CSS:["jscell-value-up","jscell-value-down","jscell-value-unchanged"],
CompareValue:0, //对比值
Dec:2, //小数位数
NullText:'--'
}
],
[CELL_TYPE_ID.CELL_STOCK_PRICE_ID,
{
Type:CELL_TYPE_ID.CELL_PERCENTAGE_ID,
CSS:["jscell-value-up","jscell-value-down","jscell-value-unchanged"],
CompareValue:0, //填前收盘价
Dec:2, //小数位数,
NullText:'--'
}
],
[CELL_TYPE_ID.CELL_BIG_NUMBER_ID, { Type:CELL_TYPE_ID.CELL_BIG_NUMBER_ID, CSS:'jscell-big-number', Dec:[2,2] }],
[CELL_TYPE_ID.CELL_INTEGER_ID, { Type:CELL_TYPE_ID.CELL_INTEGER_ID, CSS:'jscell-number', NullText:'--' }],
[CELL_TYPE_ID.CELL_DOUBLE_ID, { Type:CELL_TYPE_ID.CELL_DOUBLE_ID, CSS:'jscell-number', NullText:'--' }]
]);
if (CELL_RULE_MAP.has(type)) return CELL_RULE_MAP.get(type);
return null;
}
function JsRowItem()
{
this.Cells=[];
this.Index;
this.Element; //tr
this.Key; //主键 修改使用
this.SetCell=function(index, value, option)
{
var cell=new JsCellItem();
cell.SetValue(value, option);
this.Cells[index]=cell;
return cell;
}
this.InsertCell=function(index, value, option)
{
var cell=new JsCellItem();
cell.SetValue(value, option);
this.Cells.splice(index,0,cell);
return cell;
}
this.RemoveCell=function(index)
{
var cell=this.Cells.splice(index,1);
return cell;
}
this.Build=function(index, bodyElement)
{
this.Index=index;
if (index<bodyElement.rows.length)
this.Element=bodyElement.rows[index];
else
this.Element=bodyElement.insertRow(index);
for(var i in this.Cells)
{
var cellItem=this.Cells[i];
cellItem.Build(i, this.Element);
}
var cellCount=this.Cells.length;
while(cellCount<this.Element.cells.length)
{
this.Element.deleteCell(-1);
}
}
this.Update=function()
{
if (!this.Element) return;
for(var i in this.Cells)
{
var cellItem=this.Cells[i];
cellItem.Update();
}
}
}
function JsHeadCellItem()
{
this.CSS; //对应css样式的名字
this.Element;
this.Text;
this.Index;
this.Text;
this.RowSpan;
this.ColSpan;
this.UpdateStatus={ Value:false, CSS:false, RowSpan:false, ColSpan:false }; //是否需要更新
this.CreateElement; //自定义创建元素
this.Identfiy=JSTableHelper.CreateGuid();
this.Children=[];
this.Build=function(index, trElement)
{
this.Index=index;
if (index<trElement.cells.length)
this.Element=trElement.cells[index];
else
this.Element=trElement.insertCell(index);
this.Update();
}
this.Update=function()
{
if (!this.Element) return;
if (this.CreateElement)
{
this.CreateElement(this, this.ID);
return;
}
if (this.UpdateStatus.Value==true) this.Element.innerHTML=this.Text;
if (this.UpdateStatus.CSS==true) this.Element.className=this.CSS;
if (this.UpdateStatus.RowSpan==true) this.Element.rowSpan=this.RowSpan;
if (this.UpdateStatus.ColSpan==true) this.Element.colSpan=this.ColSpan;
this.UpdateStatus.Value=false;
this.UpdateStatus.CSS=false;
this.UpdateStatus.RowSpan=false;
this.UpdateStatus.ColSpan=false;
}
this.SetText=function(text,option)
{
if (text!=this.Text)
{
this.Text=text;
this.UpdateStatus.Value=true;
}
if (option)
{
if (option.CSS)
{
if (this.CSS!=option.CSS)
{
this.CSS=option.CSS;
this.UpdateStatus.CSS=true;
}
}
if (option.RowSpan && option.RowSpan!=this.RowSpan)
{
this.RowSpan=option.RowSpan;
this.UpdateStatus.RowSpan=true;
}
if (option.ColSpan && option.ColSpan!=this.ColSpan)
{
this.ColSpan=option.ColSpan;
this.UpdateStatus.ColSpan=true;
}
if (option.ID) this.Identfiy=option.ID;
if (option.CreateElement) this.CreateElement=option.CreateElement;
}
}
}
JsHeadCellItem.GetCellRule=function(type)
{
const CELL_RULE_MAP=new Map
([
[HEAD_CELL_TYPE_ID.CELL_STRING_ID, {Type:HEAD_CELL_TYPE_ID.CELL_STRING_ID, CSS:'jshcell-string'} ]
]);
if (CELL_RULE_MAP.has(type)) return CELL_RULE_MAP.get(type);
return null;
}
function JsHeadRowItem()
{
this.CSS; //对应css样式的名字
this.Element; //<tr>
this.Index;
this.Cells=[];
this.Build=function(index,headElement)
{
this.Index=index;
if (index<headElement.rows.length)
this.Element=headElement.rows[index];
else
this.Element=headElement.insertRow(index);
for(var i in this.Cells)
{
var item=this.Cells[i];
item.Build(i, this.Element);
}
}
this.InsertCell=function(index, text, option)
{
var cell=new JsHeadCellItem();
cell.SetText(text, option);
this.Cells.splice(index,0,cell);
return cell;
}
}
function JsTableHead()
{
this.Element; //<thead>
this.Rows=[]; // JsHeadRowItem
this.Build=function()
{
for(var i in this.Rows)
{
var rowItem=this.Rows[i];
rowItem.Build(i,this.Element);
}
}
this.InsertRow=function(index)
{
var row=new JsHeadRowItem();
this.Rows[index]=row;
return row;
}
this.RowCount=function()
{
return this.Rows.length;
}
this.GetRow=function(rowIndex, rowColunm) //获取表头单元格数据
{
return this.Rows[rowIndex].Cells[rowColunm];
}
}
function JSTable(divElement,option)
{
this.DivElement=divElement;
this.Rows=[]; //行
this.Head=new JsTableHead();
this.TableElement=document.createElement("table");
if (option && option.CSS) this.TableElement.className=option.CSS;
else this.TableElement.className='jstable jstable-metrics jstable-bordered ';
this.TableElement.id=JSTableHelper.CreateGuid();
divElement.appendChild(this.TableElement);
//表头
this.Head.Element=document.createElement("thead");
this.TableElement.appendChild(this.Head.Element);
//标题
this.BodyElement=document.createElement("tbody");
this.TableElement.appendChild(this.BodyElement);
//更新数据及行列
this.Build=function()
{
this.Head.Build();
for(var i in this.Rows)
{
var rowItem=this.Rows[i];
rowItem.Build(i,this.BodyElement);
}
//删除多余的行
var rowCount=this.Rows.length;
while(rowCount<this.BodyElement.rows.length)
{
this.BodyElement.deleteRow(-1);
}
}
//更新数据 行列不发生变化调用
this.Update=function()
{
for(var i in this.Rows)
{
var rowItem=this.Rows[i];
rowItem.Update();
}
}
this.InsertRow=function(index, row)
{
this.Rows.splice(index, 0, row);
return row;
}
this.RemoveRow=function(index) //删除行
{
var row=this.Rows.splice(index, 1);
return row;
}
this.RemoveColumn=function(index) //删除列
{
for(var i in this.Rows)
{
var item=this.Rows[i];
item.RemoveCell(index);
}
}
this.ClearRows=function()
{
this.Rows=[];
}
this.InsertColumn=function(index, data) //添加列 data:{ Value:, Option }
{
if (Array.isArray(data))
{
for(var i in this.Rows)
{
var item=this.Rows[i];
if (i<data.length)
{
const dataItem=data[i];
item.InsertCell(index,dataItem.Value, dataItem.Option);
}
else
{
item.InsertCell(index,null,JsCellItem.GetCellRule(CELL_TYPE_ID.CELL_NONE_ID));
}
}
}
else
{
for(var i in this.Rows)
{
var item=this.Rows[i];
item.InsertCell(index,data.Value, data.Option);
}
}
}
//设置单元格数据
this.SetCellValue=function(rowIndex, colIndex, value, option)
{
if (rowIndex>=this.Rows.length) return;
var row=this.Rows[rowIndex];
if (colIndex>=row.Cells.length) return;
row.Cells[colIndex].SetValue(value,option);
}
this.GetRowCount=function()
{
return this.Rows.length;
}
//排序
this.Sort=function(orderID, colIndex) //0=不排序 1=升序 2=降序
{
if (orderID==1)
{
this.Rows.sort((a,b)=>
{
return a.Cells[colIndex].Value-b.Cells[colIndex].Value;
})
}
else if (orderID==2)
{
this.Rows.sort((a,b)=>
{
return b.Cells[colIndex].Value-a.Cells[colIndex].Value;
})
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
// 公共方法
//
//
//
function JSTableHelper()
{
}
JSTableHelper.CreateGuid=function()
{
function S4()
{
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
//是否是数值
JSTableHelper.IsNumber=function(value)
{
if (value==null) return false;
if (isNaN(value)) return false;
return true;
}
//是否是整形
JSTableHelper.IsInteger=function(x)
{
return (typeof x === 'number') && (x % 1 === 0);
}
//数据输出格式化 floatPrecision=原始小数位数 changedfloatPrecision=转换以后的小数位数
JSTableHelper.FormatValueString=function(value, floatPrecision, changedfloatPrecision, languageID)
{
if (!JSTableHelper.IsNumber(value))
{
if (floatPrecision>0)
{
var nullText='-.';
for(var i=0;i<floatPrecision;++i)
nullText+='-';
return nullText;
}
return '--';
}
if (value<0.00000000001 && value>-0.00000000001)
{
return "0";
}
var absValue = Math.abs(value);
if (absValue < 10000)
return value.toFixed(floatPrecision);
else if (absValue < 100000000)
return (value/10000).toFixed(changedfloatPrecision)+"万";
else if (absValue < 1000000000000)
return (value/100000000).toFixed(changedfloatPrecision)+"亿";
else
return (value/1000000000000).toFixed(changedfloatPrecision)+"万亿";
}