Функция evalHTML может кому надо.
Функция выполняет роль обычного setter'а в innerHTML но при этом выполняет скрипты найденные в HTML.
Функция мало кому нужная, но тут попросили написать такую хрень, вот и написал. Если кому надо используйте. Ах да, она еще может работать как jQuery плагин, тоесть если у вас подключен jQuery то можно вызывать ее через jQuery. var evalHTML = (function(){ var fn = function( elem, str ) { str = str || elem; var stack = [], result; str = str.replace( /<script(?:[^>]*src="([^"]+)")?[^>]*>([\s\S]*?)<\/script>/gi, function( all, src, scriptText ) { stack[ stack.length ] = src ? { src: src } : { script: scriptText }; return ""; }); if ( window.jQuery && this instanceof jQuery ) { result = this.html( str ); } else { elem.innerHTML = str; } for( var i = 0; i < stack.length; i++ ) { if ( stack[ i ].src ) { var l, script, exists = false, head = document.getElementsByTagName( 'head' )[ 0 ], scripts = document.getElementsByTagName( 'script' ); for( l = 0; script = scripts[ l++ ]; ) { if ( script.src.indexOf( stack[ i ].src ) != -1 ) { exists = true; break; } } if ( !exists ) { script = document.createElement('script'); script.src = stack[ i ].src; script.type = "text/javascript"; head.appendChild( script ); } } else { ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( stack[ i ].script ); } } return result; } if ( window.jQuery ) { jQuery.fn.evalHTML = fn; } return fn; })(); пример без jQuery: <div id="view"></div> <script type="text/javascript"> var evalHTML = (function(){ var fn = function( elem, str ) { str = str || elem; var stack = [], result; str = str.replace( /<script(?:[^>]*src="([^"]+)")?[^>]*>([\s\S]*?)<\/script>/gi, function( all, src, scriptText ) { stack[ stack.length ] = src ? { src: src } : { script: scriptText }; return ""; }); if ( window.jQuery && this instanceof jQuery ) { result = this.html( str ); } else { elem.innerHTML = str; } for( var i = 0; i < stack.length; i++ ) { if ( stack[ i ].src ) { var head = document.getElementsByTagName( 'head' )[ 0 ], script = document.createElement('script'); script.src = stack[ i ].src; script.type = "text/javascript"; head.appendChild( script ); } else { ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( stack[ i ].script ); } } return result; } if ( window.jQuery ) { jQuery.fn.evalHTML = fn; } return fn; })(); var html = "<b>Жирный текст<script>alert('а я алерт который динамично вставили.');<"+"/script></b>"; evalHTML( document.getElementById( 'view' ), html ); </script> пример c jQuery: <script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script> <div id="view"></div> <script type="text/javascript"> var evalHTML = (function(){ var fn = function( elem, str ) { str = str || elem; var stack = [], result; str = str.replace( /<script(?:[^>]*src="([^"]+)")?[^>]*>([\s\S]*?)<\/script>/gi, function( all, src, scriptText ) { stack[ stack.length ] = src ? { src: src } : { script: scriptText }; return ""; }); if ( window.jQuery && this instanceof jQuery ) { result = this.html( str ); } else { elem.innerHTML = str; } for( var i = 0; i < stack.length; i++ ) { if ( stack[ i ].src ) { var head = document.getElementsByTagName( 'head' )[ 0 ], script = document.createElement('script'); script.src = stack[ i ].src; script.type = "text/javascript"; head.appendChild( script ); } else { ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( stack[ i ].script ); } } return result; } if ( window.jQuery ) { jQuery.fn.evalHTML = fn; } return fn; })(); var html = "<b>Жирный текст<script>alert('а я алерт который динамично вставили.');<"+"/script></b>"; $( "#view" ).evalHTML( html ); </script> |
мне надо!
беру две! спасибо. |
jQuery и так это умеет:
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script> <div id="view"></div> <script> var html = "<b>Жирный текст<script>alert('а я алерт который динамично вставили.');<"+"/script></b>"; $( "#view" ).html( html ); </script> |
Цитата:
<body>.....</body> <script> var evalString = " document.write('Hello WORLD !!!') "; var s = document.createElement('script'); s.innerHTML = evalString; document.body.appendChild(s); </script> |
Цитата:
И вообще чего это вдруг все против евала-то? или я что-то не знаю? его вырежут в будущих версия? или с помощью него можно удалить все файлы у клиента на компе? На серверных языках евал это да, плохо. Но на клиенте почему к нему такое отвращение не пойму. P.S. Функцию писал не для себя, мне честно говоря все-равно как она евалит. |
Цитата:
|
Цитата:
melky, боюсь вы не совсем точно информацию прочли о проблемах с евалом. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
Есть приложение, получающее откуда-нибудь JSON. И парсится этот JSON не с помощью JSON.parse, а с помощью eval'а. Тогда злоумышленник, получив доступ к скрипту, отдающему этот JSON, может вернуть что-нибудь вроде (function () { /* some code stealing your cookie */ }(), { /*some json data*/ }) Цитата:
(function(){ var a = 5; eval("alert(typeof a)"); window.eval("alert(typeof a)"); })() |
Цитата:
|
Цитата:
|
Цитата:
var msie = eval("/*@cc_on (@_jscript_version+'').replace(/\\d\\./, '');@*/");почему не юзаю так: var msie = /*@cc_on (@_jscript_version+'').replace(/\d\./, '');@*/потому что обфускатор вырезает этот код, так как считает его обычным комментарием. |
Цитата:
|
Цитата:
|
Вот яховский абсолютно точно переставал сжимать. Может быть в каком-то режиме. Он не ругался, он просто не сжимал ту часть, куда мог залезть eval.
|
...
|
karnas,
Покажи мне место в твоем скрипте где есть evalHTML. |
я не знаю куда и как правильно его поставить )) поставил бы его на переменную content , но там уже нет скриптов.
|
Хоть советом помогите, как в моем варианте выдачи подключить evalHTML()
console.log($(data).find("#newc").html()); тоже выводит уже код без javascript, видимо обрезка идет при передаче контента в url - url: $(this).attr('href'); а вот как избежать вырезания скриптов на этом этапе я не могу понять.. |
karnas,
Давай ты приложишь чуть больше усилий, чем просто попрошайничать на форуме?! Мне скучно, как я думаю и другим тоже, выяснять что с тобой не так. Поэтому я просто процетирую свое предыдущее сообщение: Цитата:
|
Вообще то я по русски изложил ответ на этот вопрос. Я сказал, что в данной ситуации не знаю как использовать evalHTML().
Спасибо за помощь. |
Цитата:
Цитата:
Цитата:
Здравствуйте! Судя по вашему сообщению, вы ну совсем не знаете javascript. Освойте основы языка и вопрос отпадет сам, полностью или частично. А с чем не справитесь - поможем. На сайте javascript можно начать изучать с учебника, раздел Основы javascript. Возможно, вам также понадобится HTML - учебник есть, например, здесь: http://ru.html.net/tutorials/html/ Задавайте конкретные вопросы по ходу дела. |
|
Да уж, клоуны есть везде.. Тут похоже особо тяжкий случай.
|
Цитата:
var a = 1; (function() { var a = 2; (new Function('alert(a)')()); }()); |
Всем спасибо, решил проблему регуляркой без данного плагина. Почистите пожалуйста срач с темы...
|
Цитата:
|
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 19:57. |