Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   evalScripts без regexp и eval (https://javascript.ru/forum/events/4515-evalscripts-bez-regexp-i-eval.html)

Diem 29.07.2009 21:35

evalScripts без regexp и eval
 
Есть ли какой нибудь природный способ выполнить js скрипты при обновлении содержимого DOM элемента.

Если я не ошибаюсь во всех фрэймворках для этих целей используют Regexp + eval

Вот такой пример:
<div id="div">
    DIV
</div>


<script>
    function test1() {
        var divNode = document.getElementById('div');
        var newNode = divNode.cloneNode(false);
        newNode.innerHTML = 'TEST1<script>alert("ok")<\/script>'
        divNode.parentNode.replaceChild(newNode, divNode);
    }
    
    function test2() {
        var divNode = document.getElementById('div');
        divNode.innerHTML = 'TEST2';
        
        var scriptNode = document.createElement('script');
        scriptNode.innerHTML = 'alert("ok")';
        
        divNode.appendChild(scriptNode);
    }
    
    function test3() {
        var divNode = document.getElementById('div');
        divNode.innerHTML = 'TEST3<script>alert("ok")<\/script>';
    }
</script>

<a href="" onclick="test1(); return false">Test1</a>
<a href="" onclick="test2(); return false">Test2</a>
<a href="" onclick="test3(); return false">Test3</a>


test1 и test2 работают в FF
test2 работает в Opera
В IE ничего не работает, test2 - выдаёт ошибку

У кого какие мысли на счёт того, чтоб реализовать что то подобное с test1 или test3, чтобы к примеру делать update элемента ajax-ом c выполнением скриптов содержащихся в входном html ?

Pattern 30.07.2009 17:34

вот тебе затравка для брожения
function getJSONData(){
	eval('var r='+arguments[0]+';');
	return r||null;
}
function test4(){
	var objStr="{c:'new data into div',f:function(){alert('updated!');}}";
	var j=getJSONData(objStr||null)||null;
	if(j){
		if(j.c)
			document.getElementById('div').innerHTML=j.c;
		if(j.f)
			j.f();
	}
}

работает в FF3.5 && IE8, в остальных не проверял
ЗЫЖ в любом случае, я бы не советовал тебе передавать скрипты в тело какого либо элемента, лучше вызывать уже готовые функции.


Часовой пояс GMT +3, время: 20:26.