Функция 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, время: 00:20. |