2011-01-15 4 views
1

ダイナミックに読み込まれてページに挿入されるJavaScriptのブロックを実行するときに問題が発生しました。これは、(簡略化)にロードされるコードである:SafariとIEで動的にjavascriptが実行されない

<p>i am html-code</p> 

<script type="text/javascript"> 
alert("i'm here"); 
</script> 

コードのこの部分は、このMooToolsはコマンドを注射する:

new Element('div', { 
    'class': 'foo'+item_data[id].contenttype, 
    'id': '123', 
    'html': code 
}).inject($('presentation')); 

(可変コードが最初のコードスニペットを含有する。)

Firefoxでは、これが動作します。 injectコマンドが呼び出されると、段落が表示され、javascriptが実行されます。 IEとSafariでは、段落だけが表示されます。

「eval」なしでこの問題にどのように対処できるかについてのヒントはありますか?あらかじめThx。

答えて

1

これを処理するには、片方向の良い短いarticleがあります。

IE &サファリは、デフォルトでロードした後に<SCRIPT> DOMノードを評価しないという問題があります。間違いなくセキュリティ機能です。

これを修正する基本的なやり方は、それを関数として記述し、その関数をonloadイベントで評価するように設定する必要があることです。コードが評価されることを保証します。記事の例次を盗む

、コードが更新

var script = document.createElement('script'); 
script.setAttribute('src','myjavascriptfile.js'); 
script.setAttribute('type','text/javascript'); 
var loaded = false; 
var loadFunction = function() 
{ 
    if (loaded) return; 
    loaded=true; 
    // your code goes here 
    alert("I'm here!"); 
}; 
script.onload = loadFunction; 
script.onreadystatechange = loadFunction; 

次のようになります。

あなたがここで起こった変数のカップルを持っているようですね。 MooToolsに依存するのではなく、シンプルな基本HTMLページを作成してコードを入れてください。

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'> 
<head> 
    <meta http-equiv='content-type' content='text/html; charset=utf-8' /> 

    <title>Trial</title> 
    <meta name='generator' content='BBEdit 9.6' /> 
    <script type="text/javascript"> 
    //<![CDATA[ 
    var script = document.createElement('script'); 
    script.setAttribute('src','myjavascriptfile.js'); 
    script.setAttribute('type','text/javascript'); 
    var loaded = false; 
    var loadFunction = function(){ 
    if (loaded) return; 
    loaded=true; 
    // your code goes here 
    alert("I'm here!"); 
    }; 
    script.onload = loadFunction; 
    script.onreadystatechange = loadFunction; 
    //]]> 
    </script> 
</head> 

<body> 
</body> 
</html> 

だけでなく、ほとんどの許容ブラウザの神経症、およびIEで動作するはずクリーンTidyの-EDコードです:ここで

は一例です。あなたがmyjavascriptfile.jsとしてロードされるjavascriptソースファイルを持っていると仮定すると、うまくいくはずです。

は、その後、私はで開始するmyjavascriptfile.jsとしてこれを使用することをお勧めしたい:

// myjavascriptfile.jx 
alert("My java script has loaded YAY!!"); 
+0

ありがとうございました、チャーリー。私は最初のコードを関数に入れました。しかし、Mootoolsは、注入が終了したとき(または私のコードが間違っている)にロードイベントを発生させないので、関数をトリガする方法はわかりません。 new_el.addEvent( 'load'、function(){ foo_func(); }); – bazi

0

私は、これは4年後で実現するが、私は最近、同じ問題がありました。

バックカップルMooToolsはバージョン(3.xでは、4.xおよび5.xのを)行く、addEventを使用して私のために働いていた:私は見つけた

new Element('script', { 
    src: 'myscript.js', 
    async: true 
}).addEvent('load', myFunc).inject(document.getElement('body'), 'top'); 

ことの一つは、スクリプトのロードの間の遅延しましたその内容が実行されます。

あなたはonLoadの方法で遅延を追加し、あるいはロードされたJSで発火し、代わりにそのために聞くことができます。

window.addEvent('myscripEvent', myFunc); 

new Element('script', { 
    src: 'myscript.js', 
    async: true 
}).inject(document.getElement('body'), 'top'); 

を次にmyscript.jsに:

/* my code here */ 

window.fireEvent('myscripEvent'); 
関連する問題