我正在编写一些JavaScript代码来解析用户输入的函数(用于类似电子表格的功能).解析了公式后,我可以将其转换为JavaScript并eval()在其上运行以产生结果.
但是,eval()如果我可以避免它,我总是回避使用,因为它是邪恶的(而且,无论是对还是错,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会被用户改变).
那么,什么时候可以使用它?
我有一个脚本,使用一些内容将一些内容插入元素innerHTML.
例如,内容可以是:
<script type="text/javascript">alert('test');</script>
<strong>test</strong>
Run Code Online (Sandbox Code Playgroud)
问题是<script>标签内的代码没有被执行.我用Google搜索了一下,但没有明显的解决方案.如果我使用jQuery插入内容$(element).append(content);,脚本部分eval会在注入DOM之前得到.
有没有人有一段执行所有<script>元素的代码?jQuery代码有点复杂,所以我无法弄清楚它是如何完成的.
编辑:
通过窥视jQuery代码,我已经设法弄清楚jQuery是如何做到的,这导致了以下代码:
Demo:
<div id="element"></div>
<script type="text/javascript">
function insertAndExecute(id, text)
{
domelement = document.getElementById(id);
domelement.innerHTML = text;
var scripts = [];
ret = domelement.childNodes;
for ( var i = 0; ret[i]; i++ ) {
if ( scripts && nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
}
}
for(script …Run Code Online (Sandbox Code Playgroud) 有一个名为"内容"的div:
<div id="content"></div>
Run Code Online (Sandbox Code Playgroud)
它应该由AJAX的PHP文件中的数据填充,包括<script>标记.但是,此标记内的脚本未被执行.
<div id="content"><!-- After AJAX loads the stuff that goes here -->
<script type="text/javascript">
//code
</script>
<!-- More stuff that DOES work here -->
</div>
Run Code Online (Sandbox Code Playgroud) 我正在开发一个网页,我正在进行一个AJAX调用,返回一大块HTML,如:
<div>
<!-- some html -->
<script type="text/javascript">
/** some javascript */
</script>
</div>
Run Code Online (Sandbox Code Playgroud)
我将整个东西插入DOM,但JavaScript没有运行.有没有办法运行它?
一些细节:我无法控制脚本块中的内容(因此我无法将其更改为可以调用的函数),我只需要执行整个块.我无法在响应上调用eval,因为JavaScript位于更大的HTML块中.我可以做某种正则表达式来分离出JavaScript,然后在它上面调用eval,但这很令人讨厌.谁知道更好的方法?
在body里面的div里面有一个脚本标签有什么不好的?
我正在动态更新div以重新加载div中的javascript代码.有什么问题需要担心吗?
因为@Bergi坚持要看代码.这是(见下文).这div(以及div包含演示文稿HTML元素的其他元素)通过AJAX更新.这script里面div包含用于处理页面上新加载的HTML元素和原始数据的映射.
<div>
<script type="text/javascript">
var namesMap = <dynamic string from server here>;
var addressesMap = <dynamic string from server here>;
</script>
</div>
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用React中的dangerouslySetInnerHTML属性设置从我的服务器发送的html以显示div内部.我里面也有脚本标签,并使用html中定义的函数.我在这里用JSFiddle做了错误的例子.
这是测试代码:
var x = '<html><scr'+'ipt>alert("this.is.sparta");function pClicked() {console.log("p is clicked");}</scr'+'ipt><body><p onClick="pClicked()">Hello</p></body></html>';
var Hello = React.createClass({
displayName: 'Hello',
render: function() {
return (<div dangerouslySetInnerHTML={{__html: x}} />);
}
});
Run Code Online (Sandbox Code Playgroud)
我检查并将脚本标记添加到DOM,但无法调用该脚本标记中定义的函数.如果这不是正确的方法,我可以通过其他任何方式注入脚本标记的内容.
我正在使用Selenium WebDriver尝试将外部javascript文件插入到DOM中,而不是将整个内容输入到executeScript中.
看起来它正确地将节点放入DOM中,但是它只是忽略了源,即所述源js文件上的函数不运行.
这是我的代码:
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Example {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementsByTagName('head')[0].innerHTML += '<script src=\"<PATH_TO_FILE>\" type=\"text/javascript\"></script>';");
}
}
Run Code Online (Sandbox Code Playgroud)
我链接的javascript文件的代码是
alert("hi Nate");
Run Code Online (Sandbox Code Playgroud)
我已将js文件放在我的localhost上,我使用file:///调用它,然后在外部服务器上尝试了它.没有骰子.
此外,在Java部分,我尝试使用该技巧附加'scr'+'ipt',但它仍然无效.当我使用Firefox的inspect元素检查DOM时,我可以看到它正确加载脚本节点,所以我很困惑.
我也尝试过这个解决方案,它显然是为另一个版本的Selenium(不是webdriver)制作的,因此无法在最低限度下工作:在selenium中加载包含有用测试函数的外部js文件
我有这个react.js脚本,它将以下代码添加到html中
// returned by the render method
React.DOM.div({
dangerouslySetInnerHTML: {
__html: '<script type="text/javascript" async="" src="//myapp.disqus.com/embed.js"></script>'
}
})
Run Code Online (Sandbox Code Playgroud)
现在我的HTML看起来像:
<script type="text/javascript" async="" src="//myapp.disqus.com/embed.js"></script>
Run Code Online (Sandbox Code Playgroud)
这似乎很完美,但问题是它不加载脚本.脚本标记插入到正文的中间,嵌套在其他一些div标记中.
可能是什么问题? 谢谢
我遇到了这个问题:
<body onload="document.body.innerHTML="<script>alert('hi')</script>"">
Run Code Online (Sandbox Code Playgroud)
问题是我不能在引号内的引号内使用引号.有任何想法吗?
这是检测当前引擎是否支持异步函数的一种方法:
const supportsAsyncFunctions = (() => {
try {
new Function('async () => {}')();
} catch (error) {
return false;
}
return true;
})();
Run Code Online (Sandbox Code Playgroud)
但有没有办法不使用eval或Function?
javascript ×10
html ×4
ajax ×2
eval ×2
reactjs ×2
async-await ×1
coding-style ×1
dom ×1
innerhtml ×1
java ×1
loading ×1
quotes ×1
script-tag ×1
selenium ×1
string ×1