如何过滤掉这个非法的javascript字符?它是在运行时生成的 - c#

我正在尝试使用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返回的内容中删除第一个和最后一个字符。

如何在没有for循环的情况下在Javascript中使用Django模板标签 - javascript

我想在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,…