摆脱Javascript中的困境
我有以下几点摆脱Javascript中的困境,javascript,eval,escaping,Javascript,Eval,Escaping,我有以下几点 var id='123'; newDiv.innerHTML = "<a href=\"#\" onclick=\" TestFunction('"+id+"', false);\"></a>"; 在我的HTML中呈现 我遇到的问题是,我希望调用方法TestFunction,并在我的函数StepTwostring、boolean中用作字符串参数,理想情况下,它最终会出现在实时HTML中,如图所示 <a href="#" onclick="StepT
var id='123';
newDiv.innerHTML = "<a href=\"#\" onclick=\" TestFunction('"+id+"', false);\"></a>";
在我的HTML中呈现
我遇到的问题是,我希望调用方法TestFunction,并在我的函数StepTwostring、boolean中用作字符串参数,理想情况下,它最终会出现在实时HTML中,如图所示
<a href="#" onclick="StepTwo("TestFunction('123',false)",true)"></a>
注意TestFunction在这里是一个字符串,它是在第二步中使用eval执行的
我已尝试将我的JS格式化为:
newDiv.innerHTML = "<a href=\"#\" onclick=\"StepTwo(\"TestFunction('"+id+"', false);\",true)\"></a>";
但是,尽管在我的IDE中,在呈现的HTML中,这似乎是正确的,但它的装饰令人难以置信
如果有人能为我指出正确的方向,我将不胜感激。谢谢 应该在带有双引号的HTML字符串中使用not或\
NewDiv.innerHTML=
可能有更好的方法可以做到这一点——当您发现自己在使用eval时,您应该退后一步,寻找不同的解决方案。您应该在用双引号引起来的HTML字符串中使用not或\
NewDiv.innerHTML=
也许有更好的方法可以做到这一点——当你发现自己在使用eval时,你应该退后一步,寻找不同的解决方案。尝试使用eval,而不是使用eval\
newDiv.innerHTML=尝试使用而不是\
newDiv.innerHTML=您可以创建a元素并使用DOM方法附加到click事件
像无处不在的jQuery这样的Javascript框架将使这变得更加容易。您可以创建A元素并使用DOM方法附加到click事件 像无处不在的jQuery这样的Javascript框架将使这变得容易得多 您需要交替使用“和” 也许您不需要在123周围加引号,因为Javascripts具有灵活的类型。传递它时不带引号,但将其视为TestFunction中的字符串 您需要交替使用“和” 也许您不需要在123周围加引号,因为Javascripts具有灵活的类型。传递它时不带引号,但将其视为TestFunction中的字符串
您最大的问题是使用eval,它会导致许多潜在问题,因此找到替代解决方案几乎总是更好的 你眼前的问题是你真正拥有的是
<a href="#" onclick="StepTwo("></a>
作为onclick属性开始后的下一个属性,关闭它。按照其他人的建议使用。不要使用eval。你最大的问题是使用eval,它会导致很多潜在问题,因此找到替代解决方案几乎总是更好的 你眼前的问题是你真正拥有的是
<a href="#" onclick="StepTwo("></a>
作为onclick属性开始后的下一个属性,关闭它。按照其他人的建议使用。不要使用eval。互联网上最大的资本失败之一是通过将字符串粘在一起用javascript创建html
var mya = document.createElement("a");
mya.href="#";
mya.onclick = function(){
StepTwo(function(){
TestFunction('123', false );
}, true );
};
newDiv.innerHTML = "";
newDiv.appendChild(mya);
这样就不需要任何花哨的逃逸物品
我可能应该以不同的方式执行“onclick”,但这应该是可行的,我正在努力不只是使用jQuery代码来完成所有事情
下面是我在jQuery中的实现方法:
jQuery(function($){
var container = $("#container");
var link = document.createElement("a"); /* faster than $("<a></a>"); */
$(link).attr("href", "Something ( or # )" );
$(link).click( function(){
var doStepTwo = function()
{
TestFunction('123', true );
};
StepTwo( doStepTwo, false ); /* StepTwo -> doStepTwo -> TestFunction() */
});
container.append(link);
});
用Javascript将字符串粘在一起没有好的借口
它所做的只是将html解析的开销重新添加到dom结构中,并增加了基于XSS的破坏html的可能性。即使是深受喜爱的谷歌,在他们的一些广告脚本中也出现了这种错误,在我见过的许多案例中都造成了巨大的失败,他们不想知道这一点
我不明白Javascript是唯一的借口,这不是一个好借口 互联网上最大的资本失败之一是通过将字符串粘在一起用javascript创建html
var mya = document.createElement("a");
mya.href="#";
mya.onclick = function(){
StepTwo(function(){
TestFunction('123', false );
}, true );
};
newDiv.innerHTML = "";
newDiv.appendChild(mya);
这样就不需要任何花哨的逃逸物品
我可能应该以不同的方式执行“onclick”,但这应该是可行的,我正在努力不只是使用jQuery代码来完成所有事情
下面是我在jQuery中的实现方法:
jQuery(function($){
var container = $("#container");
var link = document.createElement("a"); /* faster than $("<a></a>"); */
$(link).attr("href", "Something ( or # )" );
$(link).click( function(){
var doStepTwo = function()
{
TestFunction('123', true );
};
StepTwo( doStepTwo, false ); /* StepTwo -> doStepTwo -> TestFunction() */
});
container.append(link);
});
用Javascript将字符串粘在一起没有好的借口
它所做的只是将html解析的开销重新添加到dom结构中,并增加了基于XSS的破坏html的可能性。即使是深受喜爱的谷歌,在他们的一些广告脚本中也出现了这种错误,在我见过的许多案例中都造成了巨大的失败,他们不想知道这一点
我不明白Javascript是唯一的借口,这不是一个好借口 最好的方法是使用document.createElement创建元素,但如果您不愿意,我想您可以这样做或使用 在代码中:
newDiv.innerHTML = "<a href=\"#\" onclick=\"StepTwo('TestFunction(\'"+id+"\', false);\',true)\"></a>";
如果不起作用,请尝试将\'改为\'
请记住,该字符用于打开和关闭HTML标记上的属性。如果在属性值中使用它,浏览器会将其理解为close字符
例如:
最好的方法是使用document.createElement创建元素,但如果您不愿意,我想您可以这样做或使用 在代码中:
newDiv.innerHTML = "<a href=\"#\" onclick=\"StepTwo('TestFunction(\'"+id+"\', false);\',true)\"></a>";
如果不起作用,请尝试将\'改为\'
请记住,该字符用于打开和关闭HTML标记上的属性。如果在属性的值中使用它
e、 浏览器将其理解为关闭字符
例如:
嘿,伙计们,谢谢你们的回答。我发现,“;似乎效果最好 一旦我获得更多的声誉,我会给你们一些选票 关于eval,您在问题中看到的是正在开发的应用程序的一个非常小的快照。我理解eval的悲哀,然而,这是百万种情况中的一种,它是当前情况的正确选择 如果您能够看到这些函数为stackoverflow提供了非常通用的名称,那么您就会更好地理解它们
再次感谢 嘿,伙计们,谢谢你们的回答。我发现,“;似乎效果最好 一旦我获得更多的声誉,我会给你们一些选票 关于eval,您在问题中看到的是正在开发的应用程序的一个非常小的快照。我理解eval的悲哀,然而,这是百万种情况中的一种,它是当前情况的正确选择 如果您能够看到这些函数为stackoverflow提供了非常通用的名称,那么您就会更好地理解它们
再次感谢 你声称在这里进行评估是正确的。我不太确定 您是否考虑过这种方法:
<a href="#" onclick="StepTwo(TestFunction,['123',false],true)"></a>
你声称eval在这里是正确的。我不太确定 您是否考虑过这种方法:
<a href="#" onclick="StepTwo(TestFunction,['123',false],true)"></a>
我知道这已经是hella’old了,但是如果有人在使用eval时遇到转义字符串的问题,并且你必须使用eval,我有一种方法来避免问题
var html = '<a href="#\" onclick=" TestFunction(\''+id+'\', false);"></a>';
eval('(function(div, html){div.innerHTML = html;})')(newDiv, html);
基本上与:
var myNewMethod = function(div, html){div.innerHTML = html;}
然后我们就这样做:
myNewMethod(newDiv, html); //where html had the string containing markup
我建议不要使用eval。如果无法避免,或者如果您控制所有输入,并且没有注入风险,那么这将有助于解决字符串转义的问题
我也倾向于使用函数,但它不再安全。
以下是我使用的代码片段:
var feval = function(code) {
return (new Function(code))();
}
我知道这已经是hella’old了,但是如果有人在使用eval时遇到转义字符串的问题,并且你必须使用eval,我有一种方法来避免问题
var html = '<a href="#\" onclick=" TestFunction(\''+id+'\', false);"></a>';
eval('(function(div, html){div.innerHTML = html;})')(newDiv, html);
基本上与:
var myNewMethod = function(div, html){div.innerHTML = html;}
然后我们就这样做:
myNewMethod(newDiv, html); //where html had the string containing markup
我建议不要使用eval。如果无法避免,或者如果您控制所有输入,并且没有注入风险,那么这将有助于解决字符串转义的问题
我也倾向于使用函数,但它不再安全。
以下是我使用的代码片段:
var feval = function(code) {
return (new Function(code))();
}
再一次,正确的同时,另一个答案。但愿我能把两者都标为正确答案。一旦我有了15+的声望,我会投你一些票。谢谢你抽出时间来帮忙。再一次,请同时回答另一个问题。但愿我能把两者都标为正确答案。一旦我有了15+的声望,我会投你一些票。感谢您花时间提供帮助。如果您认为自己找到了合法的eval借口,那么您对javascript/dom的了解可能还不够。有效使用闭包比理解Eval强99/100倍,这是1/100倍。干杯我希望能多谈一点,但我不适合谈论我正在编写的特定代码。如果你认为你找到了合法的理由来进行eval,那么你对javascript/dom的了解就不够了。有效使用闭包比理解Eval强99/100倍,这是1/100倍。干杯希望我能多谈一点,但我不适合谈论我正在编写的特定代码。再次感谢。优雅的但eval在我们的应用程序中是正确的。哈哈,希望我能在我原来的帖子里写一个关于eval!的免责声明!。无论如何,非常感谢。如果第二步所做的与当前所做的不同,我会避免评估。我的答案不仅仅是为你。它也适用于所有寻找类似问题答案的人。对于那些人来说,评估可能不是正确的解决方案。然而你让我好奇。eval在这里的主要原因是什么?嘿,对不起,我不能说。我会粘贴工作中的代码,从技术上讲,这些代码属于我为之编写代码的公司。我肯定不会引起太大的骚动,但我宁愿稳妥一点。希望你能理解。再次感谢。优雅的但eval在我们的应用程序中是正确的。哈哈,希望我能在我原来的帖子里写一个关于eval!的免责声明!。无论如何,非常感谢。如果第二步所做的与当前所做的不同,我会避免评估。我的答案不仅仅是为你。它也适用于所有寻找类似问题答案的人。对于那些人来说,评估可能不是正确的解决方案。然而你让我好奇。eval在这里的主要原因是什么?嘿,对不起,我不能说。我会粘贴工作中的代码,从技术上讲,这些代码属于我为之编写代码的公司。我肯定不会引起太大的骚动,但我宁愿稳妥一点。希望你能理解。仅供参考
-字符串连接要快得多。对于1000行的网格非常有用。仅供参考-字符串连接要快得多。对于包含1000行的网格非常有用。