2009-06-07 14 views
4

読んでいただきありがとうございます。なぜこのJavascriptはOperaやChromeで動作しませんか?

私は、次のように構築されているいくつかのスクリプトがあります。

scriptone.js

function FunctionOne(){ 

    // Do a bit of work... 

    // Include a second javascript file, scripttwo.js 
    // that contains a function called FunctionTwo.js 
    var scrb = document.createElement('script'); 
    scrb.type = 'text/javascript'; 
    scrb.src = 'http://www.example.com/scripttwo.js?bunchofargs=varied'; 

    // Append it to the head. 
    document.getElementsByTagName('head')[0].appendChild(scrb); 

    // Can't run the second function directly, because it may not be loaded quite yet, 
    // So use the Waiter function. 
    Interval = setInterval("Waiter()", 10); 

    // All done. 
    return; 

} 

function Waiter(){ 
    if(window.FunctionTwo) { 
     clearInterval(Interval); 
     FunctionTwo(); 
    } 
} 

scripttwo.js

function FunctionTwo(){ 
    document.write('something based on calling page'); 
} 

これはFFと正常に動作をし、 IEは使用できますが、OperaやChromeでは使用できません。 Chrome/Operaでは、すべてがスクリプト1でうまくいくようです。しかし、実際にはscripttwo.jsで起こっていることはありません。 scripttwo.jsが含まれていないかのようです。

これはOperaまたはChromeで動作しない理由は何ですか?

恐らく私は互換性のないものを使用していますか、私が気づいていないセキュリティ機能がありますか?すべてのファイルは同じドメインにあります。


グレート回答 - 本当にありがとうございました!

FuncionOneは実際のコードではちょっとタイプミスですが、私はより良い関数名を使用しますが、わかりやすくするためにここで変更しました。私はジョー・ホワイトとは同意しますが、それは問題ではないはずです。 JavaScript(私の弱い言語の1つ)で、誰が知っていますか? FunctionOneは、HTMLドキュメントの先頭または本文のいずれかから呼び出されます。

また、スクリプト2の最後にFuncTwoを追加して、タイマーを完全に避けるというアイデアが気に入っています。誰かがあなたにそれを指摘したら、きれいで、とても明白です。

私は次の作業をしてから更新します。

を再度更新:

こんにちはすべて、

私は今、それはFF、IE、とChromeで働いていますが、オペラは今、まったくの.jsファイルをロードすることを拒否しているようです。私はこれが何らかのオペラの問題(Opera: .js file won't load)だと思っていて、他の3人と一緒に進めます。それがどのようになったかを教えてください。

答えて

1

あなたに答えを与えるかもしれないいくつかの質問/コメント:

  • FuncionOne(スペルに注意してください)を呼び出しますか?

  • タイマーは乱雑であり、常に再発するとは限りません(停止しない限り再開しません)。私はリファクタリングするWaiter()Intervalがまだ存在していない場合は、再帰的なwindow.setIntervalを作成します。

    そのノートオン
  • 、明示的Intervalの範囲が働いているwindow.

  • を省略しないwindow.setIntervalを、指定する必要がありますか?関数内で定義します。伝統的な論理では、のWaiter()にはアクセスできないと言っていましたが、JSはそれほど面倒です。 OperaとChromeは、あなたが望んでいるより少し難解かもしれません。関数スコープの外に定義するだけで解決できます。

+0

間隔は、varとしてローカルに宣言されていません。したがって、暗黙のうちにWindow.Interval(JavaScriptについて嫌なことの1つ)です。スコープは問題ではありません。 –

+0

コードが正常に動作することを確認しても、一部のプラットフォームでは正しく動作しない場合は、最初に必要なことをターゲットにする必要があります。各主要ブラウザは独自のJavascript実装を実行しているので、ギャップを埋めるための範囲がたくさんあります。 – Oli

2

多分、ScriptTwo.jsの最後にFunctionTwo()を追加することができます。その後、間隔が複雑になることなくロードされると実行されます。

3

それはOperaで私の作品..

代わりにウェイタースクリプトを使用するのは、イベントを使用することができます。

scrb.onload = function() { FunctionTwo() } 
scrb.onreadystatechange = function() { FunctionTwo() } 

Internet Explorerが動作するための第二ラインです。 Operaはこれらの両方のイベントを処理しているようだが、FunctionTwo()は2回実行されるという問題がある。これを回避するにはさまざまな方法があります。ブラウザ検出、一部のグローバル変数など

1

私は問題がIntervalスコープであると思います。 FunctionOne内で定義されますが、グローバルスコープでは定義されません。だから、Waiterを実行すると、OperaとChromeはIntervalundefinedで、FunctionTwoから静かに落ちる(おそらくスクリプトを停止するのだろうか?)と思う。 FFとIEはこれを無視するかもしれません。

(定義されていないパラメータ値を受け取ったときに、標準で何を行うべきですか?)

+0

良い質問です。 http://www.w3schools.com/js/tryit.asp?filename=tryjs_setinterval ChromeとFirefoxで試したところ、黙って失敗します。 – Nosredna

+0

@NosrednaはMacのChromeでうまく動作します –

関連する問題