2011-06-21 7 views
10

javascriptコードを実行するために、既存のDOMに要素を追加します。<script>要素をDOMに追加して、JavaScriptを実行していますか?

私はYUIでこれをやった:

var scriptNode = Y.Node.create('<script type="text/javascript" charset="utf-8">alert("Hello world!");<\/script>'); 
var headNode = Y.one('head'); 
headNode.append(scriptNode); 

それが正常にDOMに追加されますが、それは私に警告を与えるものではありません。

誰かが問題を認識していますか?

+0

JSを直接実行しない理由は何ですか? –

+0

あなたのコントロール下にある 'scriptNode'のJavascriptはありますか?それを関数にラップし、それを追加した後に呼び出します。ちょうどこれを見つけました - 適切で有益なようです:http://stackoverflow.com/questions/610995/jquery-cant-append-script-element/3603496#3603496 –

+0

あなたの終了タグには余分な '\'があり、それは、これが影響を及ぼすかどうかは分かりません。 – sharpper

答えて

35

私はYUIのNode.create()機能がどのように機能するのか分かりません。しかし、単純なクロスブラウザスクリプトは次のとおりです。

window.onload = function() { 
    var s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    var code = 'alert("hello world!");'; 
    try { 
     s.appendChild(document.createTextNode(code)); 
     document.body.appendChild(s); 
    } catch (e) { 
     s.text = code; 
     document.body.appendChild(s); 
    } 
    } 

のtry..catchブロックは、第一の方法のように、ほとんどのブラウザとして必要であるが、一部にはありませんし、エラーをスローします。第2の方法はそれらをカバーする。単純にevalのコードを使用してもかまいません。

+2

最後にdocument.body.appendChild(s)を置くことはできませんか? –

+0

はい、スクリプトノードにテキストノードを追加するとエラーが発生するので問題ありません。 – RobG

1

JQueryソースでこの機能が見つかりました。これは、私が他の方法よりも少し綺麗に思っているようです。しかし、やはり私はJSの初心者であり、おそらく細部は見えません。とにかく、誰かがこれから何か役に立つものを取るかもしれません。

function DOMEval(code, doc) { 
    doc = doc || document; 

    var script = doc.createElement("script"); 

    script.text = code; 
    doc.head.appendChild(script).parentNode.removeChild(script); 
} 
+0

removeChild呼び出しとは何ですか?追加したばかりのスクリプトは削除されませんか?私は行方不明のトリックですか? – Danger

関連する問題