結論
jQuery.html(data)としたとき、data内に存在するscript要素が切り取られた状態でappendChildされる。
切り取られたscriptはappendChildの前に、evalScript関数で評価されている。
jQuery.prettyPoppin.jsがモーダルウインドウ用の領域を作成して、そこにjQuery.htmlでhtmlを貼り付けていたので、貼り付けたhtml内のスクリプトは実行されるが、DOMには追加されていなかった。
jQuery.htmlの実装
引数の中に、<scriptか<style があると、innerHTMLではなく、jQuery.appendが呼ばれる。
appendではDomManip関数とclean関数が呼ばれ、ここで、スクリプトを切り出して、実行。
append関数は最後に、appendChildを呼ぶ。
素のJSの場合
innerHTMLでは[object HTMLScriptElement]が表示され、
appendChildだと、スクリプトが実行されて、かつスクリプト自体も残っている。(ブラウザ依存)
確認用
<html>
<head>
<script src="http://www.google.com/jsapi"></script>
<script>google.load("jquery", "1.7.1");</script>
</head>
<body>
<div id="target">aaaaaaaaaaa</div>
<script>
var script = document.createElement('script');
script.type = 'text/javascript';
script.innerHTML = 'alert(1)';
//どれかコメント外して動作確認
//$('#target').html(script);
//document.getElementById('target').appendChild(script);
//document.getElementById('target').innerHTML=script;
</script>
</body>
</html>
0 件のコメント:
コメントを投稿