意外令牌非法使用Salesforce.com中的onclick Java Script

时间:2013-07-25 17:41:06

标签: javascript

早上大部分时间我一直在努力,但没有尽头。我正在尝试执行一个在Salesforce.com中使用OnClick Java的按钮,它会不断抛出错误。我认为问题可能是数据中的特殊字符,因为当我只使用文本时它可以工作。但任何时候数字或任何特殊字符存在我得到错误“意外令牌ILLEGAL”。任何人都可以帮助我看看我做错了什么以及当涉及到特殊角色时我如何摆脱失败?

{!REQUIRESCRIPT("/soap/ajax/28.0/connection.js")} 


var opptyObj = new sforce.SObject("Opportunity");
var caseObj = new sforce.SObject("Case");
var today = new Date();
var sOpptyId = "{!Case.Opportunity__c}";

if( sOpptyId != "")
{ 
alert("This case is already tied to an opportunity!");
} 
else
{ 
opptyObj.AccountId = "{!Case.AccountId}";
opptyObj.CloseDate = sforce.internal.dateTimeToString(today);
opptyObj.Description="{!Case.Description}";
opptyObj.Case__c = "{!Case.Id}";
opptyObj.Name = "{!Case.Subject}";
opptyObj.StageName = "Estimate in Progress";
opptyObj.Created_from_Case__c = "Y";
opptyObj.Type = "New Business";
opptyObj.Amount = ".01";

var opptyresult = sforce.connection.create([opptyObj]);

if (opptyresult[0].success=='false') 
{ 
alert("Opportunity creation failed: " + opptyresult[0].errors.message);
} 
else 
{ 
caseObj.Id = '{!Case.Id}';
caseObj.Opportunity__c = opptyresult[0].id;
caseObj.Status = "Estimate in Progress";

var caseResult = sforce.connection.update([caseObj]);

if(caseResult[0].success == 'false') 
{ 
alert("Case update failed: " + caseResult[0].errors.message);
} 
else 
{ 
alert("An opportunity has been created and linked to this case.");
location.reload(true);
} 
} 
}

1 个答案:

答案 0 :(得分:0)

假设这是某种模板,无论渲染什么,都需要正确地转义它插入的字符串中的某些值。

鉴于此:

opptyObj.Description="{!Case.Description}";

假设我输入一个由以下内容组成的描述:

  “这太棒了,”约翰说。

当在模板中呈现时,结果如下:

opptyObj.Description=""That is awesome," said John.";

您可能会看到,结果是语法错误。

您需要在以这种方式插入的文本中转义引号字符。如果不知道什么是技术呈现此模板,我无法向您提供任何细节,但您希望将"替换为\",将'替换为\'\转义字符,强制它们被视为字符串中的文字字符而不是其他特殊含义。

这必须在插入脚本时完成。本着这个精神:

opptyObj.Description="{!Case.Description.replace(/'/, "\\'").replace(/"/, '\\"')}

具体如何做取决于此处使用的语言或模板引擎。但是结果应该是这样的:

opptyObj.Description="\"That is awesome,\" said John.";

Ruby on Rails implements an escape_javascript method,用于清理注入Javascript的数据。它执行以下替换。这似乎是一个很好的基线。

  • '\\' => '\\\\'
  • '</' =&gt; '<\/'
  • "\r\n" =&gt; '\n'
  • "\n" =&gt; '\n'
  • "\r" =&gt; '\n'
  • '"' =&gt; '\\"'
  • "'" =&gt; "\\'"

更新:

根据这个:http://www.salesforce.com/us/developer/docs/pages/Content/pages_security_tips_scontrols.htm

看起来你想要JSENCODE功能。也许是这样的事情?

opptyObj.Description="{!JSENCODE(Case.Description)}";