相关疑难解决方法(0)

什么时候JavaScript的eval()不是邪恶的?

我正在编写一些JavaScript代码来解析用户输入的函数(用于类似电子表格的功能).解析了公式后,我可以将其转换为JavaScript并eval()在其上运行以产生结果.

但是,eval()如果我可以避免它,我总是回避使用,因为它是邪恶的(而且,无论是对还是错,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会被用户改变).

那么,什么时候可以使用它?

javascript coding-style eval

253
推荐指数
9
解决办法
8万
查看次数

执行用.innerHTML插入的<script>元素

我有一个脚本,使用一些内容将一些内容插入元素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)

javascript dom eval innerhtml

104
推荐指数
8
解决办法
14万
查看次数

在AJAX检索的<div>中执行<script>

有一个名为"内容"的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)

html javascript ajax

94
推荐指数
5
解决办法
21万
查看次数

如何执行动态加载的JavaScript块?

我正在开发一个网页,我正在进行一个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,但这很令人讨厌.谁知道更好的方法?

javascript ajax

38
推荐指数
3
解决办法
5万
查看次数

在div中有脚本标签是不是很糟糕?

在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)

html javascript

24
推荐指数
3
解决办法
5万
查看次数

React:使用dangerouslySetInnerHTML插入时脚本标记不起作用

我正在尝试使用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,但无法调用该脚本标记中定义的函数.如果这不是正确的方法,我可以通过其他任何方式注入脚本标记的内容.

html javascript script-tag reactjs

19
推荐指数
3
解决办法
2万
查看次数

如何使用selenium将javascript文件加载到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文件

javascript java selenium selenium-webdriver

17
推荐指数
2
解决办法
3万
查看次数

为什么在运行时添加<script>标记不会加载javascript文件?(with react.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标记中.

可能是什么问题? 谢谢

javascript loading reactjs

16
推荐指数
1
解决办法
1万
查看次数

HTML:在引号内的引号内使用引号

我遇到了这个问题:

<body onload="document.body.innerHTML="<script>alert('hi')</script>"">
Run Code Online (Sandbox Code Playgroud)

问题是我不能在引号内的引号内使用引号.有任何想法吗?

html javascript string quotes double-quotes

15
推荐指数
2
解决办法
2万
查看次数

如何在没有eval的情况下检测异步功能支持?

这是检测当前引擎是否支持异步函数的一种方法:

const supportsAsyncFunctions = (() => {
  try {
    new Function('async () => {}')();
  } catch (error) {
    return false;
  }

  return true;
})();
Run Code Online (Sandbox Code Playgroud)

但有没有办法不使用evalFunction

javascript async-await

15
推荐指数
1
解决办法
1721
查看次数