ইনার এইচটিএমএল সহ <স্ক্রিপ্ট> উপাদান Execোকানো হচ্ছে


111

আমি একটি স্ক্রিপ্ট পেয়েছি যা ব্যবহার করে উপাদানগুলিতে কিছু সামগ্রী সন্নিবেশ করিয়েছে innerHTML

উদাহরণস্বরূপ বিষয়বস্তু হতে পারে:

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

সমস্যাটি হ'ল <script>ট্যাগের অভ্যন্তরীণ কোডটি কার্যকর হয় না। আমি এটি কিছুটা গুগল করেছিলাম তবে এর কোনও আপাত সমাধান নেই। যদি আমি jQuery ব্যবহার করে সামগ্রীটি sertedোকাতাম $(element).append(content);তবে স্ক্রিপ্টের অংশগুলি evalডিওমে ইনজেকশনের আগে 'ডি' হয়ে গেল।

এমন কি কোডের একটি স্নিপেট রয়েছে যা সমস্ত <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
আপনি কেন কেবলমাত্র এলিমেন্টের শিশুদের পুনরাবৃত্তি করতে পারবেন না এবং প্রতিটি স্ক্রিপ্ট উপাদান হিসাবে আপনি কেবলমাত্র সেই সন্তানের অন্তর্নির্মিত HTML () প্রকাশ করেছেন? এটি এমনভাবে দেখেছি যে এটি একটি বড় উপাদান বিক্রেতার দ্বারা সম্পন্ন হয়েছে, প্রতিবার যখন তারা একটি এজ্যাক্স কলব্যাক সম্পূর্ণ করে যা ডমটিতে স্টাফ যুক্ত করে তারা ঠিক তা করে। এটি ধীর হতে পারে, বিশেষত আই 7-তে মনে রাখবেন।
স্লাগস্টার

2
আন্দ্রেস: যদি আমি কোনও ফাংশন যুক্ত করি, উদাহরণস্বরূপ function testFunction(){ alert('test'); }অভ্যন্তরীণ এইচটিএমএল কোডটি .োকানো হয়েছে এবং তারপরে এটি কল করার চেষ্টা করে, এটি বলে যে ফাংশনটি সংজ্ঞায়িত হয়নি।
ফিদাহ

1
দারুণ ফিদা, মোহন, চিয়ার্সের মতো কাজ করে
মার্সিন

3
আমি মনে করি যে ক্রস-সাইট স্ক্রিপ্টিং আক্রমণগুলি রোধ করার জন্য ব্রাউজারের দ্বারা আচরণ করা এটি বোঝা একেবারেই গুরুত্বপূর্ণ। আপনি যে পাঠ্যটি অভ্যন্তরীণ এইচটিএমএল হিসাবে সেট করেছেন তা যদি বব সরবরাহ করে তবে এটি অ্যালিসের ব্রাউজারে ক্ষতির কারণ হয়ে দাঁড়াবে (এমন একটি ফোরামের কথা চিন্তা করুন যেখানে লোকেরা তাদের কাছে স্ক্রিপ্ট-ট্যাগ যুক্ত করে মন্তব্য লিখতে পারে)। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: en.wikedia.org/wiki/Cross-site_scriptting । বাঁচাও!
জাতিয়ান

1
একটি এইচটিএমএল 2010 সাল থেকে অনেক পরিবর্তন এই বর্তমান দিন, হয়তো আপনি চান বর্ণন: stackoverflow.com/a/58862506/890357
marciowb

উত্তর:


27

ওপি-র স্ক্রিপ্টটি আইই in. তে কাজ করে না, এসওর সহায়তায়, এখানে একটি স্ক্রিপ্ট রয়েছে যা:

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

স্ক্রিপ্টটি একবার ডিওমে ইনজেকশনের পরে, আমি কীভাবে এটি সরিয়ে ফেলব?
এস 4 বিআর

1
স্ক্রিপ্টটি পুনরাবৃত্তিযোগ্য নয়, সুতরাং কেবল সরাসরি বাচ্চাদের দিকে নজর দেবে। এটি আমার জন্য কাজ করে:if (nodeName(child, "script" ) && (!child.type || child.type.toLowerCase() === "text/javascript")) { scripts.push(child); } else { exec_body_scripts(child); }
st4wik

2
নোট করুন যে উপরের কোডটি স্ক্রিপ্টগুলি চালায় না যা এসসিআর মাধ্যমে লোড হয়। উপরের স্ক্রিপ্টটি চেক করতে পরিবর্তিত হতে পারে elem.srcএবং শর্তসাপেক্ষে srcতৈরি করা স্ক্রিপ্ট উপাদানের সম্পত্তিটির পাঠ্য সামগ্রী সেট করার পরিবর্তে সেট করতে হবে ।
রায়ান মরলোক

কোনও উপাদান তৈরি এবং এটিতে প্রবেশের পরিবর্তে বৈশ্বিক evalকৌশলটি ব্যবহার করবেন না কেন ? তারা উভয়ই বর্তমান বন্ধটি প্রকাশ না করে জেএস কোড কার্যকর করে। <script><head>
ফিনেসে

31

@ ফিদাঃ ... এখানে আপনার সমস্যার খুব আকর্ষণীয় সমাধান: http://24ways.org/2005/have-your-dom-and-script-it-too

সুতরাং এটি পরিবর্তে এটি দেখতে হবে:

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


2
এবং আরও ভাল, "অনিরর" ইভেন্টের সাথে একটি চিত্র থাকার দরকার নেই, দ্রুত এক্সএসএস ইনজেকশন jvfconsulting.com/blog/47/… :) এর জন্য চমৎকার
ব্যাপটেক্স

11
আপনি <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">যদি অকেজো HTTP অনুরোধ রোধ করতে চান তবে আপনি ব্যবহার করতে পারেন ।
সাভাস বেদোভা

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ব্যবহারকারীর ক্ষতি করার জন্য তৈরি করা হয়েছিল। যে কোনও গতিশীল স্ক্রিপ্ট কার্যকর করা ঝুঁকিপূর্ণ এবং এ কারণেই সিএসপি এটিকে কল করে 'unsafe-eval'কারণ এটি। আপনি যদি কোনও লাইব্রেরিতে এটি ব্যবহার না করে থাকেন তবে আপনার সাইটগুলির সুরক্ষাটিকেও এটি আঘাত করছে they
জোনাথনকিংস্টন

ক্রোম 44 এ এটি পরীক্ষা করার ফলে যখন অ্যাপেন্ডচিল্ড বলা হয় তখন এটি অসীম লুপ তৈরি করে কারণ এই স্ক্রিপ্টস দৈর্ঘ্যের মান বৃদ্ধি করে।
কোডউইথচিজ

4
srcসম্পত্তির সাথে স্ক্রিপ্টগুলি অ্যাসিক্রোনক্রমে ডাউনলোড করা হবে এবং আগত হিসাবে কার্যকর করা হবে। অর্ডার সংরক্ষণ করা হয় না। ইনলাইন স্ক্রিপ্টগুলি অ্যাসিঙ্কগুলির আগে সিঙ্ক্রোনালি আউট-অর্ডার কার্যকর করা হবে।
রবার্ট 4

21

আপনার অভ্যন্তরীণ এইচটিএমএল বৈশিষ্ট্যটি ব্যবহার করা উচিত নয় বরং নোডের অ্যাপেন্ডচিল্ড পদ্ধতিটি: নথির গাছের একটি নোড [এইচটিএমএল ডিওএম] ব্যবহার করা উচিত। এইভাবে আপনি পরে আপনার ইনজেকশন কোডটি কল করতে সক্ষম হন।

নিশ্চিত হয়ে নিন যে আপনি বুঝতে পারছেন যে node.innerHTML এটির মতো নয় node.appendChild । আপনি আরও বিশদ এবং DOM এর জন্য জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সে কিছু সময় ব্যয় করতে চাইতে পারেন। আশা করি নিম্নলিখিতটি সহায়তা করে ...

নমুনা ইনজেকশন কাজ করে:

<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 প্রাপ্য, এটি আমার পেয়েছে।
রিগসফলি

আমি এটি ইউভি কারণ জাভাস্ক্রিপ্ট কোড ইনজেকশনের সবচেয়ে সহজ উপায় যা ইনজেকশনের পরে কার্যকর হয় exec আমি কেবল অভ্যন্তরীণ এইচটিএমএল যোগ করার মধ্যে পার্থক্য বুঝতে পারি না যা কার্যকর হয় না এবং অ্যাপেন্ডচিল্ড যা কার্যকর করে তার সাথে উপরের উপায়টি। আমি এটি সফলভাবে সকেট.ইওর সাথে স্ক্র্যাচ থেকে স্ক্রিপ্ট সহ একটি গতিশীল পৃষ্ঠা তৈরি করতে ব্যবহার করেছি
জলাবদ্ধতা

2
var _in = document.getElementById(inject);, আমি মনে করি.
রন বার্ক

21

সরলিকৃত ES6 সংস্করণ @ জোশকমলির উত্তরের একটি উদাহরণ সহ।

কোনও জিকুয়েরি নেই, কোনও গ্রন্থাগার নেই, কোনও খণ্ডন নেই, কোনও ডিওএম পরিবর্তন নেই, খাঁটি জাভাস্ক্রিপ্ট।

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
পেরে মিমন

নোট করুন যে সংযুক্ত প্লাঙ্করে, ফাংশনের নাম setInnerHTMLতবে এটি ফাংশনের setInnerHtmlমধ্যে থেকেই ডাকা হচ্ছে runB। অতএব উদাহরণটি কার্যকর হয় না
ড্যানবার্স

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

হ্যাঁ এই পদ্ধতিটি কাজ করে তবে আপনি যদি ত্রুটিগুলি পেয়ে থাকেন তবে আপনার কাছে মন্তব্য বা কনসোল.লগ রয়েছে তাই এটির জন্য নজর রাখুন আপনি মডিউলগুলির জন্য অ্যাকাউন্টেও পরিবর্তন করতে পারেন var মডিউলগুলি [[] var ক্লিনড = টেক্সট.রেপ্লেস (/ <স্ক্রিপ্ট ([^> ] *)> ([\ s \ এস] *?) <\ / স্ক্রিপ্ট> / জিআই, ফাংশন (এম, ট্যাগস, স্ক্রিপ্ট) {যদি (/type="module"/.test(tags)) {মডিউল.পশ (স্ক্রিপ্ট)} স্ক্রিপ্টগুলি + = স্ক্রিপ্ট + '\ n' রিটার্ন ''})
জাভর

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);  
   }  
}  

এটি আমার প্রকল্পে ক্রোমে কাজ করে


দ্রুত এবং সুন্দর। ধন্যবাদ.
জর্গে ফুয়েন্তেস গঞ্জালেজ

এটাই! ধন্যবাদ.
ফ্লোরিস

7

"ইভাল" ব্যবহার না করেই একটি সমাধান:

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.writeমাধ্যমে লোড হওয়া স্ক্রিপ্টগুলি ব্যবহার করে src। দুর্ভাগ্যক্রমে এমনকি এটি গুগল অ্যাডসেন্স স্ক্রিপ্টগুলির সাথেও কাজ করে না।


1
আপনি কি বলছেন যে এটি সহজ? এটি ছোটও নয়। আমি সবসময় ভাবি যে jQuery অতিরিক্ত ব্যবহার করা একটি খারাপ ধারণা।
মানঙ্গো

2

শুধু কর:

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

1
একটি প্রতিভা ধারণা মত চেহারা
পেরি মিমন

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

আইরি 10-এ পুরোপুরি ভালভাবে কাজ করা ল্যারির স্ক্রিপ্টকে ধন্যবাদ, আমি এটি ব্যবহার করেছি:

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

0

ল্যারির বাইরে বাড়ানো। আমি এটিকে পুনরুদ্ধার করে পুরো ব্লক এবং শিশু নোডগুলি অনুসন্ধান করেছিলাম।
স্ক্রিপ্ট এখন src পরামিতি দ্বারা নির্দিষ্ট করা বাহ্যিক স্ক্রিপ্টগুলিও কল করবে। স্ক্রিপ্টগুলি inোকানোর পরিবর্তে মাথায় সংযোজন করা হয় এবং সেগুলি পাওয়া যায় এমন ক্রমে রেখে দেওয়া হয়। সুতরাং বিশেষত অর্ডার স্ক্রিপ্ট সংরক্ষণ করা হয়। এবং প্রতিটি স্ক্রিপ্ট সিঙ্ক্রোনালি কার্যকরভাবে ব্রাউজারটি প্রাথমিক ডিওএম লোডিং পরিচালনা করে similar সুতরাং আপনার যদি কোনও স্ক্রিপ্ট ব্লক থাকে যা কোনও সিডিএন থেকে jQuery কল করে এবং পরবর্তী স্ক্রিপ্টের চেয়ে নোড jQuery ব্যবহার করে ... কোনও সমস্যা নেই! ওহ এবং আমি ট্যাগ প্যারামিটারে যা সেট করেছি তার ভিত্তিতে একটি সিরিয়ালযুক্ত আইডি দিয়ে সংযুক্ত স্ক্রিপ্টগুলি ট্যাগ করেছি যাতে আপনি এই স্ক্রিপ্টটির মাধ্যমে কী যুক্ত হয়েছিল তা খুঁজে পেতে পারেন।

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

এটি ব্যবহার করে দেখুন, এটি ক্রোম, সাফারি এবং ফায়ারফক্সে আমার জন্য কাজ করে:

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

তবে একটি বিষয় লক্ষণীয়, নিম্নলিখিত ডিভ-নেস্টেড স্ক্রিপ্টটি চলবে না:

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

স্ক্রিপ্টটি চালনার জন্য এটি নোড হিসাবে তৈরি করতে হবে এবং তারপরে শিশু হিসাবে সংযোজন করতে হবে। এমনকি আপনি আগের ইনজেকশন ডিভের ভিতরেও কোনও স্ক্রিপ্ট সংযোজন করতে পারেন এবং এটি চলবে (বিজ্ঞাপন সার্ভার কোডটি কাজ করার চেষ্টা করার আগে আমি এটিতে চালিত হয়েছি):

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

ল্যাম্বডারের উত্তর বাড়িয়ে দেওয়া

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

আপনি আপনার স্ক্রিপ্টটি তৈরি করতে এবং লোড করতে বেস 64 চিত্র ব্যবহার করতে পারেন

<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

আমার অনুরূপ কিছু প্রয়োজন ছিল, তবে মূল স্ক্রিপ্টের মতো একই স্থানে থাকা বা পুনরায় তৈরি করার জন্য আমার স্ক্রিপ্টের প্রয়োজন ছিল, যেহেতু আমার স্ক্রিপ্টটি ডিওমে স্ক্রিপ্ট ট্যাগের অবস্থান / লক্ষ্য উপাদান তৈরি করতে লক্ষ্যবস্তু করে targe আমি স্ক্রিপ্টটিকে পুনরাবৃত্ত করেছিলাম তা নিশ্চিত করার জন্য যে এটি একের বেশি স্তর নীচে থাকলে এটিও কাজ করে।

দ্রষ্টব্য: আমি 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

টাইপস্ক্রিপ্টে এই নতুন সহায়ক ফাংশন তৈরি করেছেন, সম্ভবত কেউ এটির প্রশংসা করবে। আপনি যদি স্ক্রিপ্টের প্যারামিটার থেকে প্রকারের ঘোষণাকে সরিয়ে ফেলেন তবে এটি কেবল সাধারণ জেএস হবে।

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.