0

我正在尝试删除可能出现在我的 Google Analytics 标记中的特殊字符,因为特殊字符似乎会导致某些版本的 IE 中的脚本错误。我有这个功能:

                function removeSplChars(inStr) {
                inStr = inStr.replace(/[^a-zA-Z0-9 ]/g, "");
                return inStr;
                }

并且有当前有效的GA代码:

                <script type="text/javascript">
                var _gaq = _gaq || [];
                _gaq.push(['_setAccount', '<c:out value="${profileId}"/>']);
                <c:choose>
                <c:when test="${(lastCmdName eq 'CategoryDisplay') or (lastCmdName eq 'ProductDisplay')}" >
                _gaq.push(['_setCustomVar',
                2, // This custom var is set to slot #2.
                '<c:choose><c:when test="${WCParam.source eq 'search'}">Search</c:when><c:otherwise><c:out value="${topCat}" /></c:otherwise></c:choose>', // The top-level name for your online content categories.
                '<c:choose><c:when test="${WCParam.source eq 'search'}">Search <c:out value="${WCParam.searchTerm}" /></c:when><c:otherwise><c:out value="${topCat}" />|<c:out value="${subCatA}" />|<c:out value="${subCatB}" />|<c:out value="${subCatC}" /></c:otherwise></c:choose>', // Records value of breadcrumb name
                3 // Sets the scope to page-level.
                ]); 
                </c:when>
                <c:otherwise>
                </c:otherwise>
                </c:choose>
                 _gaq.push(['_trackPageview']);
                (function() {
                var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
                ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
                var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
                })();
                </script>

但是当我将该函数放在代码中时,我仍然看到 Chrome 调试器中出现了特殊字符。例如,当我打开一个包含名为“Matt's”的产品的页面时,它会显示为 Matt's。我想要的是马茨。我们还有其他带有 & 和其他特殊字符的产品名称,所以我只想允许 Az 和数字(大写/没有大写都可以)

任何意见,将不胜感激。我查看了关于 SO 的以下帖子,但到目前为止还没有找到任何可以帮助我完成这项工作的内容:

如何处理 (® ´ © ¿ ¡ ° À ) javascript 中的特殊字符?
javascript regexp remove all special characters
使用 JavaScript 从字符串中删除除空格以外的所有特殊字符

我是 JSP 和 JavaScript 的新手,所以我确定我没有将代码放在正确的位置,或者我可能需要在页面上添加其他内容?我尝试将 removeSplChars 函数放在 () 中或添加一个 ; 没有运气。不幸的是,我必须在工作中学习这一点,所以我必须专注于完成我被赋予的任务,而不是花时间真正理解语言的逻辑/语法。

4

2 回答 2

1

问题不在于函数本身,它来自其他地方。证明:http: //jsfiddle.net/wDaCw/

于 2012-10-05T13:46:03.870 回答
0

在评论中,我要求您向我们展示removeSplChars调用函数的代码,令我惊讶的是,您告诉我您没有在任何地方调用它。好吧,这回答了为什么什么都没有改变的问题。如果您不使用要更改的数据调用该函数,则不会发生任何更改。

我试图了解您的问题是什么,因为它不应该是一个问题......然后我仔细查看了您的代码并发现了这一点:

'<c:choose><c:when test="${WCParam.source eq 'search'}">Search <c:out value="${WCParam.searchTerm}" /></c:when><c:otherwise><c:out value="${topCat}" />|<c:out value="${subCatA}" />|<c:out value="${subCatB}" />|<c:out value="${subCatC}" /></c:otherwise></c:choose>'

您应该注意到,颜色编码使单词search的颜色与字符串的其余部分不同。这是因为您已经用单引号开始字符串,因此字符串将在下一个单引号处结束。

我注意到您正在使用我不熟悉的 JSP。我查了一下,发现这些标签在发送到客户端之前由您的服务器解析,并替换为一些文本。

由于您遇到像单引号这样的特殊字符的问题,因此问题很明显:您的标签输出的字符串没有转义为 javascript 字符串的一部分。我认为所有可能的 Unicode 字符中唯一有问题的字符是双引号 (u+0022)、单引号 (u+0027) 和反斜杠 (u+005c),因为它们必须用反斜杠 (如\",\'\\)转义

现在,您如何在 JSP 中做到这一点?我不知道,但我知道你不是第一个遇到这个问题的人。我快速搜索给了我这个页面,他们建议如下:

<spring:message code="${escapedString}" javaScriptEscape="true"/>

现在,正如我所说,我不熟悉 JSP,所以我只是猜测。尝试替换您的所有用法,<c:out value="xxx"/>如下所示:

<c:out value="${WCParam.searchTerm}" />

有了这个:

<spring:message code="${WCParam.searchTerm}" javaScriptEscape="true"/>

如果这不起作用,请查看此答案

于 2012-10-05T21:19:53.730 回答