向mailto主体传递特殊字符会导致JavaScript崩溃

Passing special characters to mailto body blows up JavaScript

本文关键字:JavaScript 崩溃 特殊字符 mailto 主体      更新时间:2023-09-26

我有一个c# ASP。NET应用程序,它为一些用户配置信息创建一个JavaScript值数组。在客户端,我使用jQuery/JavaScript读取数组并生成一个mailto链接。有些字段可以包含特殊字符,如' & = / ' "

下面是c#代码:
private String generateElementsArray(){
  StringBuilder sb = new StringBuilder();
  sb.Append("var currentElements = { currentUserName: '");
  sb.Append(currentUserName);
  sb.Append("', currentUserEmail: '");
  sb.Append(currentUserEmail);
  sb.Append("', currentSite: '");
  sb.Append(currentSite);
  sb.Append("', currentTitle: '");
  sb.Append(currentTitle);
  sb.Append("'}");
  return sb.ToString();
}    

我将上面方法的值写入页面,生成以下JavaScript:

<script type="text/javascript">var currentElements = { currentUserName: 'Alex', currentUserEmail: 'myemailID', currentSite: 'Helpdesk', currentTitle: 'Phone User Guides & Troubleshooting'}</script>

然后我使用以下JavaScript代码生成电子邮件链接,将锚标记附加到页面上的一个元素:

function generateEmailTo(){
  var body = currentElements.currentUserName + ' has shared a page with you on the intranet.%0A%0APage Title: %22' +
    currentElements.currentTitle.replace("&","and")  + '%22%0A' + $(location).attr('href').replace('#',''); 
  var subject = currentElements.currentUserName + ' has shared a page with you on the intranet';
  var mailto = 'mailto: ?body=' + body + '&subject=' + subject;
  var anchor = '<a href="' + mailto + '"></a>';
  $("#email-placeholder").wrap(anchor);
}
....
<img id="email-placeholder" title="Send this page to a friend." src="<%= baseUrl %>/SiteAssets/media/icons/email-icon.gif"/>

对于mailto正文文本,我注意到它只需要一小部分编码字符,例如%22用于双引号,%0A用于换行符。如何将特殊字符(如单引号、与号等)传递给mailto正文文本,并使JavaScript满意?

Mailto是一个URI方案,所以它的所有组件都必须是URI编码的。您可以使用JavaScript encodeuriccomponent函数对邮件组件进行编码。请看下面的例子:

function buildMailTo(address, subject, body) {
    var strMail = 'mailto:' + encodeURIComponent(address)
                   + '?subject=' + encodeURIComponent(subject)
                   + '&body=' + encodeURIComponent(body);
    return strMail;
}
var strTest = buildMailTo('abc@xyz.com', 'Foo&foo', 'Bar'nBar');
/* strTest should be "mailto:abc%40xyz.com?subject=Foo%26foo&body=Bar%0ABar" */
window.open(strTest);