.innerHTML로 삽입 된 <script> 요소 실행


111

을 사용하여 요소에 일부 콘텐츠를 삽입하는 스크립트가 innerHTML있습니다.

예를 들어 내용은 다음과 같습니다.

<script type="text/javascript">alert('test');</script>
<strong>test</strong>

문제는 <script>태그 안의 코드 가 실행되지 않는다는 것입니다. 나는 그것을 조금 봤지만 명백한 해결책이 없었다. jQuery를 사용하여 콘텐츠를 삽입하면 $(element).append(content);스크립트 부분이 evalDOM에 삽입되기 전에 'd'가 발생했습니다.

모든 <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 in scripts)
    {
      evalScript(scripts[script]);
    }
  }
  function nodeName( elem, name ) {
    return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
  }
  function evalScript( elem ) {
    data = ( elem.text || elem.textContent || elem.innerHTML || "" );

    var head = document.getElementsByTagName("head")[0] || document.documentElement,
    script = document.createElement("script");
    script.type = "text/javascript";
    script.appendChild( document.createTextNode( data ) );
    head.insertBefore( script, head.firstChild );
    head.removeChild( script );

    if ( elem.parentNode ) {
        elem.parentNode.removeChild( elem );
    }
  }

  insertAndExecute("element", "<scri"+"pt type='text/javascript'>document.write('This text should appear as well.')</scr"+"ipt><strong>this text should also be inserted.</strong>");
</script>

1
요소의 자식을 반복 할 수없고 스크립트 요소 인 각 요소에 대해 해당 자식의 innerHtml을 eval ()하는 이유는 무엇입니까? 이것이 대규모 구성 요소 공급 업체가 DOM에 항목을 추가하는 ajax 콜백을 완료 할 때마다 정확히 수행하는 것을 본 방법입니다. 특히 IE7에서는 느릴 수 있음을 명심하십시오.
slugster 2010

2
Andreas : 예 function testFunction(){ alert('test'); }를 들어 innerHTML에 삽입 된 코드에 함수를 추가 한 다음 호출을 시도하면 함수가 정의되어 있지 않다는 메시지가 표시됩니다.
phidah

1
최고 phidah는, 매력, 환호처럼 작동
마르신

3
이것이 크로스 사이트 스크립팅 공격을 방지하기 위해 브라우저가 의도 한 동작이라는 것을 이해하는 것이 절대적으로 중요하다고 생각합니다. innerHTML로 설정 한 텍스트가 Bob에 의해 제공되면 Alice의 브라우저에서 실행되어 손상을 입힐 수 있습니다 (사람들이 스크립트 태그를 추가하는 댓글을 작성할 수있는 포럼을 생각해보십시오). 여기에서 더 많은 것을 읽을 수 있습니다 : en.wikipedia.org/wiki/Cross-site_scripting . 저장하십시오!
Xatian

1
HTML은 2010 년 이후로 많이 변경되었습니다. 요즘에는보기를 원할 수도 있습니다. stackoverflow.com/a/58862506/890357
marciowb

답변:


27

OP의 스크립트는 IE 7에서 작동하지 않습니다. SO의 도움으로 다음을 수행하는 스크립트가 있습니다.

exec_body_scripts: function(body_el) {
  // Finds and executes scripts in a newly added element's body.
  // Needed since innerHTML does not run scripts.
  //
  // Argument body_el is an element in the dom.

  function nodeName(elem, name) {
    return elem.nodeName && elem.nodeName.toUpperCase() ===
              name.toUpperCase();
  };

  function evalScript(elem) {
    var data = (elem.text || elem.textContent || elem.innerHTML || "" ),
        head = document.getElementsByTagName("head")[0] ||
                  document.documentElement,
        script = document.createElement("script");

    script.type = "text/javascript";
    try {
      // doesn't work on ie...
      script.appendChild(document.createTextNode(data));      
    } catch(e) {
      // IE has funky script nodes
      script.text = data;
    }

    head.insertBefore(script, head.firstChild);
    head.removeChild(script);
  };

  // main section of function
  var scripts = [],
      script,
      children_nodes = body_el.childNodes,
      child,
      i;

  for (i = 0; children_nodes[i]; i++) {
    child = children_nodes[i];
    if (nodeName(child, "script" ) &&
      (!child.type || child.type.toLowerCase() === "text/javascript")) {
          scripts.push(child);
      }
  }

  for (i = 0; scripts[i]; i++) {
    script = scripts[i];
    if (script.parentNode) {script.parentNode.removeChild(script);}
    evalScript(scripts[i]);
  }
};

4
jQuery를 더 잘 사용 $(parent).html(code)하십시오-아래 내 대답을 참조하십시오.
iirekm

스크립트가 DOM에 주입되면 어떻게 제거해야합니까?
S4beR

1
스크립트는 재귀 적이 지 않으므로 직계 자식 만 살펴 봅니다. 이것은 나를 위해 작동합니다 :if (nodeName(child, "script" ) && (!child.type || child.type.toLowerCase() === "text/javascript")) { scripts.push(child); } else { exec_body_scripts(child); }
st4wik

2
위 코드는 src를 통해로드되는 스크립트를 실행하지 않습니다. 위의 스크립트는 텍스트 내용을 설정하는 대신 생성 된 스크립트 요소 elem.srcsrc속성 을 확인 하고 조건부로 설정 하도록 변경할 수 있습니다 .
Ryan Morlok 2015

요소를 만들고 삽입 하는 대신 전역 eval트릭 을 사용하지 않는 이유 <script><head>무엇입니까? 둘 다 현재 클로저를 노출하지 않고 JS 코드를 실행합니다.
Finesse

31

@phidah ... 다음은 문제에 대한 매우 흥미로운 해결책입니다. http://24ways.org/2005/have-your-dom-and-script-it-too

따라서 대신 다음과 같이 보일 것입니다.

<img src="empty.gif" onload="alert('test');this.parentNode.removeChild(this);" />


2
더 좋은 점은 "onerror"이벤트가있는 이미지를 가질 필요가 없다는 것입니다. 빠른 XSS 주입에 적합합니다. jvfconsulting.com/blog/47/… :)
baptx

11
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">쓸모없는 http 요청을 막고 싶다면 사용할 수 있습니다 .
Savas Vedova 2015

1
그것을 사랑해! (추가 style="display:none;깨진 이미지 아이콘을 숨길 수)
크리스

사실, <style>보다 낫다 <img>는 네트워크 요구하지 않기 때문에,
유역

23

다음은 src속성 이있는 스크립트에서도 작동하는 더 짧고 효율적인 스크립트입니다 .

function insertAndExecute(id, text) {
    document.getElementById(id).innerHTML = text;
    var scripts = Array.prototype.slice.call(document.getElementById(id).getElementsByTagName("script"));
    for (var i = 0; i < scripts.length; i++) {
        if (scripts[i].src != "") {
            var tag = document.createElement("script");
            tag.src = scripts[i].src;
            document.getElementsByTagName("head")[0].appendChild(tag);
        }
        else {
            eval(scripts[i].innerHTML);
        }
    }
}

참고 : eval제대로 사용하지 않으면 보안 취약점이 발생할 수 있지만 스크립트 태그를 즉석에서 만드는 것보다 훨씬 빠릅니다.


1
이것은 나를 도왔지만 eval을 사용하여 더러워졌습니다. 텍스트가 손상되지 않는지 확인하기 취약점이 보이지 않습니다.
John

@ random-user eval는 사용자 를 해치도록 설계되었습니다. 동적 스크립트 실행은 위험하며 이것이 CSP가이를 호출하는 'unsafe-eval'이유입니다. 라이브러리에서 사용할 경우 사이트를 끌 수 없기 때문에 사이트의 보안도 손상됩니다.
jonathanKingston

Chrome 44에서이를 테스트하면 scripts.length 값이 증가하므로 appendChild가 호출 될 때 무한 루프가 발생합니다.
Codewithcheese

4
src속성이있는 스크립트는 비동기 적으로 다운로드되고 도착한대로 실행됩니다. 주문은 유지되지 않습니다. 인라인 스크립트는 비동기 스크립트보다 동 기적으로 실행되지 않습니다.
robert4

21

innerHTML 속성을 사용하지 말고 Node : 문서 트리의 노드 [HTML DOM]의 appendChild 메서드를 사용하면 안됩니다. 이렇게하면 나중에 삽입 된 코드를 호출 할 수 있습니다.

그것이과 node.innerHTML 같지 않다는 것을 이해했는지 확인하십시오 node.appendChild. 자세한 내용과 DOM에 대한 Javascript Client Reference에 시간을 할애 할 수 있습니다. 다음이 도움이되기를 바랍니다.

샘플 주입 작동 :

<html>
<head>
<title>test</title>
<script language="javascript" type="text/javascript">
    function doOnLoad(){
        addScript('inject',"function foo(){ alert('injected'); }");
    }


    function addScript(inject,code){
        var _in = document.getElementById('inject');
        var scriptNode = document.createElement('script');
        scriptNode.innerHTML = code;
        _in.appendChild(scriptNode);
    }

</script>
</head>
<body onload="doOnLoad();">
    <div id="header">some content</div>
    <div id="inject"></div>
    <input type="button" onclick="foo(); return false;" value="Test Injected" />
</body>
</html>

문안 인사,


2
마지막으로 다른 모든 try this, look how clever I am답변 보다는 실제로 문제에 대해 약간 설명하는 사람 . UV를받을 자격이 있습니다.
RiggsFolly

주입 후 실행되는 자바 스크립트 코드를 주입하는 가장 간단한 방법이기 때문에. 실행되지 않는 innerHTML로 추가하는 것과 실행되는 appendChild로 위의 방법을 추가하는 것의 차이점을 이해하지 못했습니다. 나는 socket.io와 함께 스크래치 스크립트로 동적 페이지를 성공적으로 만들었습니다.
wetlip

2
var _in = document.getElementById(inject);, 나는 생각한다.
론 버크

21

예제와 함께 @joshcomley의 답변의 단순화 된 ES6 버전.

JQuery 없음, 라이브러리 없음, 평가 없음, DOM 변경 없음, 순수한 Javascript.

http://plnkr.co/edit/MMegiu?p=preview

var setInnerHTML = function(elm, html) {
  elm.innerHTML = html;
  Array.from(elm.querySelectorAll("script")).forEach( oldScript => {
    const newScript = document.createElement("script");
    Array.from(oldScript.attributes)
      .forEach( attr => newScript.setAttribute(attr.name, attr.value) );
    newScript.appendChild(document.createTextNode(oldScript.innerHTML));
    oldScript.parentNode.replaceChild(newScript, oldScript);
  });
}

용법

$0.innerHTML = HTML;    // does *NOT* run <script> tags in HTML
setInnerHTML($0, HTML); // does run <script> tags in HTML

1
오타 : 함수의 이름은 setInnerHtml없다setInnerHTML
pery 미몬

연결된 plnkr에서 함수 이름은 setInnerHTML이지만 함수 setInnerHtml내에서 runB호출됩니다. 따라서 예제가 작동하지 않습니다
danbars

16

이 스 니펫을 시도하십시오.

function stripAndExecuteScript(text) {
    var scripts = '';
    var cleaned = text.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){
        scripts += arguments[1] + '\n';
        return '';
    });

    if (window.execScript){
        window.execScript(scripts);
    } else {
        var head = document.getElementsByTagName('head')[0];
        var scriptElement = document.createElement('script');
        scriptElement.setAttribute('type', 'text/javascript');
        scriptElement.innerText = scripts;
        head.appendChild(scriptElement);
        head.removeChild(scriptElement);
    }
    return cleaned;
};


var scriptString = '<scrip' + 't + type="text/javascript">alert(\'test\');</scr' + 'ipt><strong>test</strong>';
document.getElementById('element').innerHTML = stripAndExecuteScript(scriptString);

예,이 방법은 작동하지만 주석이나 console.logs가 있으면 오류가 발생하므로 모듈을 고려하여 수정할 수도 있습니다. var modules = [] var clean = text.replace (/ <script ([^> ] *)> ([\ s \ S] *?) <\ / script> / gi, function (m, tags, script) {if (/type="module"/.test(tags)) {modules.push (스크립트) return} scripts + = script + '\
n'return

13
function insertHtml(id, html)  
{  
   var ele = document.getElementById(id);  
   ele.innerHTML = html;  
   var codes = ele.getElementsByTagName("script");   
   for(var i=0;i<codes.length;i++)  
   {  
       eval(codes[i].text);  
   }  
}  

내 프로젝트의 Chrome에서 작동합니다.


빠르고 예쁘다. 감사합니다.
Jorge Fuentes González

그게 다야! 감사합니다.
Floris

7

"eval"을 사용하지 않는 솔루션 :

var setInnerHtml = function(elm, html) {
  elm.innerHTML = html;
  var scripts = elm.getElementsByTagName("script");
  // If we don't clone the results then "scripts"
  // will actually update live as we insert the new
  // tags, and we'll get caught in an endless loop
  var scriptsClone = [];
  for (var i = 0; i < scripts.length; i++) {
    scriptsClone.push(scripts[i]);
  }
  for (var i = 0; i < scriptsClone.length; i++) {
    var currentScript = scriptsClone[i];
    var s = document.createElement("script");
    // Copy all the attributes from the original script
    for (var j = 0; j < currentScript.attributes.length; j++) {
      var a = currentScript.attributes[j];
      s.setAttribute(a.name, a.value);
    }
    s.appendChild(document.createTextNode(currentScript.innerHTML));
    currentScript.parentNode.replaceChild(s, currentScript);
  }
}

이것은 본질적으로 스크립트 태그를 복제 한 다음 차단 된 스크립트 태그를 새로 생성 된 태그로 대체하여 실행을 허용합니다.


3

scriptNode.innerHTML = codeIE에서는 작동하지 않았습니다. 할 수있는 유일한 방법은 교체입니다 scriptNode.text = code그리고 그것을 잘 작동


3

$(parent).html(code)대신 jquery를 사용하는 것이 더 쉽습니다 parent.innerHTML = code.

var oldDocumentWrite = document.write;
var oldDocumentWriteln = document.writeln;
try {
    document.write = function(code) {
        $(parent).append(code);
    }
    document.writeln = function(code) {
        document.write(code + "<br/>");
    }
    $(parent).html(html); 
} finally {
    $(window).load(function() {
        document.write = oldDocumentWrite
        document.writeln = oldDocumentWriteln
    })
}

이것은 사용하는 스크립트 document.writesrc속성을 통해로드 된 스크립트에서도 작동 합니다. 불행히도 이것은 Google 애드 센스 스크립트에서 작동하지 않습니다.


1
더 쉽다고 말하는 이유는 무엇입니까? 더 짧지 않습니다. 나는 항상 jQuery를 남용하는 것은 나쁜 생각이라고 생각합니다.
Manngo

2

그냥 해:

document.body.innerHTML = document.body.innerHTML + '<img src="../images/loaded.gif" alt="" onload="alert(\'test\');this.parentNode.removeChild(this);" />';

1
천재의 생각처럼
pery 미몬

0

이 게시물을 볼 수 있습니다 . 코드는 다음과 같습니다.

var actualDivToBeUpdated = document.getElementById('test');
var div = document.createElement('div');
div.innerHTML = '<script type="text/javascript">alert("test");<\/script>';
var children = div.childNodes;
actualDivToBeUpdated.innerHTML = '';
for(var i = 0; i < children.length; i++) {
    actualDivToBeUpdated.appendChild(children[i]);
}

0

IE10에서 완벽하게 잘 작동하는 Larry의 스크립트 덕분에 다음과 같이 사용했습니다.

$('#' + id)[0].innerHTML = result;
$('#' + id + " script").each(function() { this.text = this.text || $(this).text();} );

0

Larry 's에서 확장. 전체 블록과 자식 노드를 재귀 적으로 검색하도록했습니다.
이제 스크립트는 src 매개 변수로 지정된 외부 스크립트도 호출합니다. 스크립트는 검색된 순서대로 삽입 및 배치되는 대신 헤드에 추가됩니다. 따라서 특히 주문 스크립트가 보존됩니다. 그리고 각 스크립트는 브라우저가 초기 DOM 로딩을 처리하는 방식과 유사하게 동 기적으로 실행됩니다. 따라서 CDN에서 jQuery를 호출하는 스크립트 블록이 있고 다음 스크립트 노드가 jQuery를 사용하는 경우 ... 문제가 없습니다! 아, 그리고이 스크립트에 의해 추가 된 내용을 찾을 수 있도록 태그 매개 변수에 설정 한 내용을 기반으로 직렬화 된 ID로 추가 된 스크립트에 태그를 지정했습니다.

exec_body_scripts: function(body_el, tag) {
    // Finds and executes scripts in a newly added element's body.
    // Needed since innerHTML does not run scripts.
    //
    // Argument body_el is an element in the dom.

    function nodeName(elem, name) {
        return elem.nodeName && elem.nodeName.toUpperCase() ===
              name.toUpperCase();
    };

    function evalScript(elem, id, callback) {
        var data = (elem.text || elem.textContent || elem.innerHTML || "" ),
            head = document.getElementsByTagName("head")[0] ||
                      document.documentElement;

        var script = document.createElement("script");
        script.type = "text/javascript";
        if (id != '') {
            script.setAttribute('id', id);
        }

        if (elem.src != '') {
            script.src = elem.src;
            head.appendChild(script);
            // Then bind the event to the callback function.
            // There are several events for cross browser compatibility.
            script.onreadystatechange = callback;
            script.onload = callback;
        } else {
            try {
                // doesn't work on ie...
                script.appendChild(document.createTextNode(data));      
            } catch(e) {
                // IE has funky script nodes
                script.text = data;
            }
            head.appendChild(script);
            callback();
        }
    };

    function walk_children(node) {
        var scripts = [],
          script,
          children_nodes = node.childNodes,
          child,
          i;

        if (children_nodes === undefined) return;

        for (i = 0; i<children_nodes.length; i++) {
            child = children_nodes[i];
            if (nodeName(child, "script" ) &&
                (!child.type || child.type.toLowerCase() === "text/javascript")) {
                scripts.push(child);
            } else {
                var new_scripts = walk_children(child);
                for(j=0; j<new_scripts.length; j++) {
                    scripts.push(new_scripts[j]);
                }
            }
        }

        return scripts;
    }

    var i = 0;
    function execute_script(i) {
        script = scripts[i];
        if (script.parentNode) {script.parentNode.removeChild(script);}
        evalScript(scripts[i], tag+"_"+i, function() {
            if (i < scripts.length-1) {
                execute_script(++i);
            }                
        });
    }

    // main section of function
    if (tag === undefined) tag = 'tmp';

    var scripts = walk_children(body_el);

    execute_script(i);
}

0

이것을 시도하면 Chrome, Safari 및 Firefox에서 작동합니다.

var script = document.createElement('script');
script.innerHTML = 'console.log("hi")';
document.body.appendChild(script); 
--> logs "hi"

그러나 한 가지 주목할 점은 다음 div 중첩 스크립트가 실행되지 않는다는 것입니다.

var script = document.createElement('div');
script.innerHTML = '<script>console.log("hi")</script>';
document.body.appendChild(script);
--> doesn't log anything

스크립트를 실행하려면 노드로 생성 한 다음 자식으로 추가해야합니다. 이전에 삽입 된 div 내부에 스크립트를 추가 할 수도 있으며 실행될 것입니다 (이전에 광고 서버 코드가 작동하도록 시도 할 때 실행했습니다).

var div = document.createElement('div');
div.id = 'test-id';
document.body.appendChild(div);
var script = document.createElement('script');
script.innerHTML = 'console.log("hi")';
document.getElementById('test-id').appendChild(script);
--> logs "hi"

0

Lambder 의 답을 넓히다

document.body.innerHTML = '<img src="../images/loaded.gif" alt="" > onload="alert(\'test\');this.parentNode.removeChild(this);" />';

base64 이미지를 사용하여 스크립트를 만들고로드 할 수 있습니다.

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAAADUlEQVQYV2P4//8/AwAI/AL+iF8G4AAAAABJRU5ErkJggg=="
    onload="var script = document.createElement('script');  script.src = './yourCustomScript.js'; parentElement.append(script);" />

또는 가지고 있다면 Iframe대신 사용할 수 있습니다

<iframe src='//your-orginal-page.com' style='width:100%;height:100%'
    onload="var script = document.createElement('script');  script.src = './your-coustom-script.js'; parentElement.append(script);"
    frameborder='0'></iframe>

0

비슷한 것이 필요했지만 스크립트가 요소를 생성 / 타겟팅하기 위해 DOM에서 스크립트 태그의 위치를 ​​대상으로하기 때문에 원본 스크립트와 동일한 위치에 남아 있거나 다시 생성 될 스크립트가 필요했습니다. 또한 스크립트를 재귀 적으로 만들어서 한 단계 이상 내려도 작동하는지 확인했습니다.

참고 : const여기서 사용 var합니다. 이전 브라우저를 사용하는 경우 .

    window.exec_body_scripts = function(body_el) {
        // ref: /programming/2592092/executing-script-elements-inserted-with-innerhtml based on Larry K's answer
        // Finds and executes scripts in a newly added element's body.
        // Needed since innerHTML does not run scripts.
        //
        // Argument body_el is an element in the dom.
        const
            type__Js = 'text/javascript',
            tagName__Script = 'script',
            tagName__Script__Upper = tagName__Script.toUpperCase();
        var scripts = [], script, i;
        function evalScript(elem) {
            var parent = elem.parentNode,
                data = (elem.text || elem.textContent || elem.innerHTML || ""),
                script = document.createElement(tagName__Script);

            script.type = type__Js;
            try {
                // doesn't work on ie...
                script.appendChild(document.createTextNode(data));
            } catch (e) {
                // IE has funky script nodes
                script.text = data;
            }
            // Make sure to re-insert the script at the same position
            // to make sure scripts that target their position
            // in the DOM function as expected.
            var parent = elem.parentNode;
            parent.insertBefore(script, elem);
            parent.removeChild(elem);
        };
        // Get all scripts (recursive)
        if (typeof (document.querySelectorAll) !== typeof (void 0)) {
            document.querySelectorAll('script').forEach((scr) => { if (!scr.type || scr.type.toLowerCase() === type__Js) scripts.push(scr); });
        }
        else {
            var children_nodes = body_el.childNodes, child;
            for (i = 0; children_nodes[i]; i++) {
                child = children_nodes[i];
                if (
                    child.nodeName
                    &&
                    child.nodeName.toUpperCase() === tagName__Script__Upper
                    &&
                    (
                        !child.type
                        ||
                        child.type.toLowerCase() === type__Js
                    )
                ) {
                    scripts.push(child);
                }
                // Recursive call
                window.exec_body_scripts(child);
            }
        }
        for (i = 0; scripts[i]; i++) {
            evalScript(scripts[i]);
        }
    };

0

TypeScript에서이 새로운 도우미 함수를 만들었으므로 누군가 감사 할 것입니다. 스크립트 매개 변수에서 유형 선언을 제거하면 일반 JS가됩니다.

const evalPageScripts = () => {
  const scripts = document.querySelectorAll('script');

  scripts.forEach((script: HTMLScriptElement) => {
    const newScript = document.createElement('script');
    newScript.type = 'text/javascript';
    newScript.src = script.src;

    if (script.parentNode) {
      script.parentNode.removeChild(script);
    }

    return document.body.appendChild(newScript);
  })
};

export default evalPageScripts;


-1

eval () 함수를 사용해보십시오.

data.newScript = '<script type="text/javascript">//my script...</script>'
var element = document.getElementById('elementToRefresh');
element.innerHTML = data.newScript;
eval(element.firstChild.innerHTML);

이것은 제가 개발중인 프로젝트의 실제 예입니다. 이 게시물 덕분에


-1

다음은 최근 프로젝트의 솔루션입니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sample</title>
</head>
<body>
<h1 id="hello_world">Sample</h1>
<script type="text/javascript">
 var div = document.createElement("div");
  var t = document.createElement('template');
  t.innerHTML =  "Check Console tab for javascript output: Hello world!!!<br/><script type='text/javascript' >console.log('Hello world!!!');<\/script>";
  
  for (var i=0; i < t.content.childNodes.length; i++){
    var node = document.importNode(t.content.childNodes[i], true);
    div.appendChild(node);
  }
 document.body.appendChild(div);
</script>
 
</body>
</html>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.