摆脱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行的网格非常有用。