2011-06-29 1 views
0

bodyタグへのリンクの取得に問題があります。私が試した:オペラのDocument.body

  1. document.bodyを、文書のチャイルズを列挙、それが唯一のheadタグ:(
  2. document.getElementsByTagName見つかっている間、残念ながらそれはtagNameをすることにより
  3. 検索体がnullの場合、undefinedを返す

onloadイベントハンドラのbodyタグへのリンクを取得しようとしています。これはページのHTMLコードです:

<html> 
    <head> 
     <title>Some page</title> 
     <script src="/adv.js" type="text/javascript"></script> 
    </head> 
    <body> 
     This is text 
    </body> 
</html> 

ここadv.jsのソースコード:adLoader.js

(function() { 

    var myRandom = function (min, max) { 
     return Math.floor(Math.random() * (max - min + 1)) + min; 
    }; 

    var myFunction = function() { 
     var newScriptAddr = '/adLoader.js?r=' + myRandom(1,1000000); 

     var fileref = document.createElement('script'); 
     if (typeof fileref != "undefined") 
     { 
      fileref.setAttribute("type", "text/javascript"); 
      fileref.setAttribute("src", newScriptAddr); 

      document.getElementsByTagName("head")[0].appendChild(fileref); 
     } 
    }; 

    if (window.onload) 
    { 
     var currOnLoad = window.onload; 
     window.onload = function() { 
      currOnLoad(); 
      myFunction(); 
     }; 
    } 
    else 
     window.onload = myFunction(); 

})(); 

ソースコード:

(function() { 

    var mainCnt = document.createElement('div'); 
    mainCnt.appendChild(document.createTextNode('The text')); 

    var _body = document.body; 

    if (!_body) 
    { 
     var htmlTag = document.documentElement; 
     for(var i = 0; i < htmlTag.childNodes.length; i++) 
     { 
      if (htmlTag.childNodes[i].nodeName.toLowerCase() == 'body') 
      { 
       _body = htmlTag.childNodes[i]; 
       break; 
      } 
     } 
    } 

    if (!_body) 
     _body = document.getElementsByTagName('BODY') [0]; 

    if (!_body) 
     _body = document.getElementsByTagName('body') [0]; 

    if (_body) 
     _body.appendChild(mainCnt); 
    else 
     alert('WTF!!'); 

})(); 

ブラウザはOperaの11.10 OS Ubuntu Linuxのです。このリンクを取得する方法はありますか?私の目標はposition:fixedのdivをbodyタグに追加することです。

+1

JSコードを添付してください – yoavmatchulsky

+1

JSはどこですか?ページの内側にあるのですか(もしそうなら、あなたのサンプルコードでそれを見ることができません)?拡張機能ですか?ブックマークレット?あなたはそれをどのようにonloadハンドラにアタッチしていますか? – Quentin

+0

Opera独自の開発サイトには 'document.body.appendChild()'の例があるので、動作しないのは奇妙です。 (http://dev.opera.com/articles/view/introduction-to-user-javascript/ - この例では 'document.body'をテストしていますが、なぜそれが利用できないのかを説明せずにテストしています) – nnnnnn

答えて

3

myFunction()は関数を返さないため、undefinedwindow.onloadに割り当てています。おそらく、window.onload = myFunction;

とにかく、現時点では、コードはすぐに実行され、body要素には到達していません。

+3

これは正解ですが、なぜOperaでこの問題に遭遇したのかが分かりません。すべてのブラウザで壊れない理由は、あなたがappendChild()で挿入した外部スクリプトを読み込んでいる間に解析を続けるブラウザがあるため、現在のコードでOperaが失敗するからです。 (これは修正する必要のある既知のバグです)。 – hallvors

+0

私はちょうど同じ問題を抱えていました。私の 'document.getElementsByTagName( 'BODY')[0]' Javascript行はOperaで 'undefined'エラーを返していました。この問題は、javacriptコードを ''タグの後ろに置くことで修正されました。Operaではすべての外部JSファイルがロードされてから、ページの残りの部分に進むためです。 – pppglowacki

-1

headタグのjsコードとonloadイベントの前にbodyタグを照会すると、ブラウザが頭を読み込んでいる間にnullを取得する必要があります。

+0

質問は、コードはonloadイベントハンドラにあると言います。 – Quentin