我正在尝试使用Microsoft图表控件生成自定义工具提示。 Microsoft Chart Controls支持使用keywords的功能,该功能可帮助您自动化要显示的数据。
例如,
string toolTip = string.Format("<div> {0}: {1} {3} ({2}) </div>", seriesName, "#VALY", "#VALX", "<br>");
series.MapAreaAttributes = "onfocus=\"if(this.blur)this.blur();\" onmouseover=\"DisplayTooltip('" + JavaScriptStringLiteral(toolTip) + "');\" onmouseout=\"DisplayTooltip('');\"";
在上面的代码中,“#VALY”和“ #VALX”是关键字。在运行时,这些关键字将替换为实际值。在我的场景中,#VALY是双精度型,而#VALX是日期时间。
观察:
现在,如果我使用数据系列的工具提示属性,则可以很好地工作。不幸的是,FireFox和Opera不(轻松)支持多行工具提示。我试图通过使用“自定义工具提示”来使此功能无效。
因此,我有onmouseover和onmouseout代码-这是负责工具提示的javascript。
问题是,在评估#VALX时,其中包含非法的JavaScript字符。这将导致错误消息“未捕获的SyntaxError:意外的令牌ILLEGAL”
请注意,我已经用方法JavaScriptStringLiteral包装了工具提示。这是实用程序功能:
private static readonly Regex scriptTagRegex = new Regex("script", RegexOptions.IgnoreCase | RegexOptions.Multiline);
/// <summary>
/// Processes the provided string, creating a quoted JavaScript string literal.
/// </summary>
/// <param name="str">The string to process</param>
/// <returns>A string containing a quoted JavaScript string literal</returns>
public static string JavaScriptStringLiteral(string str)
{
var sb = new StringBuilder();
sb.Append("\"");
foreach (char c in str)
{
switch (c)
{
case '\"':
sb.Append("\\\"");
break;
case '\\':
sb.Append("\\\\");
break;
case '\b':
sb.Append("\\b");
break;
case '\f':
sb.Append("\\f");
break;
case '\n':
sb.Append("\\n");
break;
case '\r':
sb.Append("\\r");
break;
case '\t':
sb.Append("\\t");
break;
default:
int i = (int)c;
if (i < 32 || i > 127)
{
sb.AppendFormat("\\u{0:X04}", i);
}
else
{
sb.Append(c);
}
break;
}
}
sb.Append("\"");
// If a Javascript tag contains "</script>", then it terminates a
// script block. Start by replacing each 's'/'S' with an escape
// sequence so it doesn't trigger this.
return scriptTagRegex.Replace(
sb.ToString(),
m => (m.Value[0] == 's' ? "\\u0073" : "\\u0053") + m.Value.Substring(1));
}
如果未对#VALX进行运行时评估,我相信此实用程序方法将解决我的问题。但是,实用程序函数因此将“ #VALX”评估为字符串文字。然后,在不过滤任何非法字符之后,将对#VALX进行评估并将非法字符放入我的JavaScript中。
有没有办法防止这个问题? C#中的路径是否等同于“ @”字符?
编辑:我想出了解决方案,它是哑巴。
foreach (HistoricalDataValue value in data)
{
series.Points.AddXY(string.Format("{0:d}{1}{0:T}", value.TimeStamp, "\\n"), value.AttributeValue);
}
请注意这说“ \\ n”。这曾经说过Environment.NewLine,但这是行不通的。此外,如果使用Environment.NewLine -OR-“ \ n”,则由于运行时评估而无法在以后编辑“ #VALX”。因此,在添加X值时必须使用转义的换行符,以便在#VALX得到它时,它已经正确格式化了。
谢谢
参考方案
当您调用JavaScriptStringLiteral
时,您的代码已经打开了单引号字符串,而该函数返回的是已经用双引号引起来的字符串。
您应该从JavaScriptStringLiteral
返回的内容中删除第一个和最后一个字符。
我想在JavaScript中使用模板变量:我的问题是在javascript代码中使用for循环,for循环之间的所有事情都会重复..但我不想要....下面粘贴了我的代码..有人可以告诉我更好的方法吗这..因为这看起来很丑..这是我的代码: {% block extra_javascript %} <script src="/static/js…
使用JS和PHP更改弹出窗口背景图像 - javascript我有一个JS函数:function zoom(now) { document.getElementById("popup").style.display = "block"; document.getElementById("photos").style.backgroundImage = …
打印二维阵列 - javascript我正在尝试打印子元素。在this example之后。怎么做?。$myarray = array("DO"=>array('IDEAS','BRANDS','CREATIVE','CAMPAIGNS'), "JOCKEY"=>a…
执行onclick时获得意外令牌 - javascript我正在使用onclick事件从PHP调用JS函数。这是我的代码:我在一个函数中,因此我需要通过PHP来完成它,因为然后我会返回:$html = '<input type="checkbox" checked value="1" id="setGetSku" name="se…
Javascript到PHP的转换 - javascript我有一个libphonenumber软件包的javascript端口,它具有以下功能:function cleanPhone(a){ a=a.replace(/[^\d\+]/g,""); return a="+"==a.substr(0,1)?"+"+a.replace(/[^\d]/g,…