0

これが私の問題です。おそらく私自身の非常に明白で愚かな間違いであり、私には気付かないようです。私は JavaScript をあまり使用していません。このコードはかなり明白だと思います。3 つの .swf ファイルを表示しています。3 つの乱数を生成するスクリプトの結果に応じて、埋め込まれたフラッシュ ムービーの「src」属性と「value」属性を編集したいと考えています。

setAttribute と element.value="ecc .." の両方を使用してみました どれも機能しません、属性は同じままです

<!DOCTYPE HTML>

<html>
<head>
<title>example</title>
<link rel="stylesheet" type="text/css" href="styles.css" />
</head>

<body>

<script type="text/javascript">
var prereel1=Math.floor(Math.random()*25);
var reel1="flash/"+ prereel1 + ".swf";
var prereel2=Math.floor(Math.random()*25);
var reel2="flash/"+ prereel2 + ".swf";
var prereel3=Math.floor(Math.random()*25);
var reel3="flash/"+ prereel3 + ".swf";
document.getElementById("slot1").value=reel1; 
document.getElementById("slot2").setAttribute("value", reel2);
document.getElementById("slot3").setAttribute("value", reel3);
document.getElementById("eslot1").src=reel1;
document.getElementById("eslot2").setAttribute("src", reel2);
document.getElementById("eslot3").setAttribute("src", reel3);
</script>

<div id="slots">

<    object width="150" height="210">
<param id="slot1" name="movie" value="flash/1.swf">
<embed id="eslot1" src="flash/1.swf" width="150" height="210">
</embed>
</object><object width="150" height="210">
<param id="slot2" name="movie" value="flash/1.swf">
<embed id="eslot2" src="flash/1.swf" width="150" height="210">
</embed>
</object><object width="150" height="210">
<param id="slot3"  name="movie" value="flash/1.swf">
<embed id="eslot3" src="flash/1.swf" width="150" height="210">
</embed>
</object>

</div>

</body>
</html>
4

3 に答える 3

2

Raynos が言ったように、スクリプトはオブジェクトが実際に存在する前に実行されます。

コードを関数にカプセル化し、window.onload を使用してその関数をトリガーすることができます。

window.onload = randomizeMovies;

于 2011-04-18T00:25:27.233 に答える
2

スクリプトは、Flash オブジェクトの上に配置されます。

ページが順番に読み込まれます。スクリプトに到達すると、ID「slot1」のDOMでオブジェクトを見つけようとしましたが、まだロードされていないため、何も見つかりません。

したがって、スクリプトをコンテンツの下に配置します。

<div id="slots">

<object width="150" height="210">
<param id="slot1" name="movie" value="flash/1.swf">
<embed id="eslot1" src="flash/1.swf" width="150" height="210">
</embed>
</object><object width="150" height="210">
<param id="slot2" name="movie" value="flash/1.swf">
<embed id="eslot2" src="flash/1.swf" width="150" height="210">
</embed>
</object><object width="150" height="210">
<param id="slot3"  name="movie" value="flash/1.swf">
<embed id="eslot3" src="flash/1.swf" width="150" height="210">
</embed>
</object>

</div>

<script type="text/javascript">
var prereel1=Math.floor(Math.random()*25);
var reel1="flash/"+ prereel1 + ".swf";
var prereel2=Math.floor(Math.random()*25);
var reel2="flash/"+ prereel2 + ".swf";
var prereel3=Math.floor(Math.random()*25);
var reel3="flash/"+ prereel3 + ".swf";
document.getElementById("slot1").value=reel1; 
document.getElementById("slot2").setAttribute("value", reel2);
document.getElementById("slot3").setAttribute("value", reel3);
document.getElementById("eslot1").src=reel1;
document.getElementById("eslot2").setAttribute("src", reel2);
document.getElementById("eslot3").setAttribute("src", reel3);
</script>

onloadまたは、コードをブロックでラップすることもできます。

<script type="text/javascript">
window.onload = function() {
    // code here
};
</script>

これは、ページの読み込みが完了したときにのみコードが実行されることを意味します。次に、Flash オブジェクトが DOM に配置され、アクセスできるようになります。

于 2011-04-18T00:21:19.290 に答える
1

答え 1 と 2 を実行し終わったら、

document.getElementById('slot1').src="何とか"; またはより確実な方法: document.getElementById('slot1').setAttriibute('src', "blah");

あなたが行ったように、どちらの方法でも機能します(確かに覚えていません)が、後者はクロスブラウザです(間違いなく)。

はい、JavaScriptコードは、アクセスしている要素の後に配置されている場合にのみ機能するようです。時々 head 要素で動作するのを見たことがありますが、そこで動作が一貫しておらず、ブラウザがページをロードしたことを確認する解決策をまだ見つけていません。ブラウザの「暴走スクリプト」エラーを引き起こさないように、タイマーを使用してページがロードされていることを確認する while ループでしょうか。今日はそのコンセプトをいじくり回す必要があります。

(ああ、ダニー・グッドマンの本には、ドキュメントの読み込み中に実行されるスクリプトは、ドキュメントとそのオブジェクトの生成に貢献するはずであると書かれています。彼はそのためのコードを提供していません。したがって、オンロードを避けてください)

于 2011-04-18T03:30:57.087 に答える