Beat: Fehler im MSIE

Hallo

Ich habe einen Fehler im MSIE7.
Fehler Zeile 45 = Ende CodeBlock
Vielleicht kann mir jemand sagen, wo der Hund begraben liegt

BTW würde mich eure Meinung zu diesem kleinen Social Bookmark Script interessieren.
Stichwort Codequalität.
(die window.onload Funktion wird noch ersetzt.)

Ich fand AddThis wegen dem  ganzen Tracking zum kotzen.
Hier wird ein SpriteImage verwendet.

  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
<html>  
<head>  
<title>BEISPIEL</title>  
<style type="text/css">  
</style>  
<script type="text/javascript">  
var bookmarkbar = {  
	serv: [  
		['twitter',	'http://twitthis.com/twit?url=','&title=',''],  
		['google',	'http://www.google.com/bookmarks/mark?op=edit&output=popup&bkmk=','&title=',''],  
		['bookmarks.ch','http://www.bookmarks.ch/add.html?w=','&title=',''],  
		['facebook','http://www.facebook.com/sharer.php?u=','',''],  
		['delicious','http://www.icio.de/add.php?url=','&title=',''],  
		['myspace',	'http://www.myspace.com/Modules/PostTo/Pages/?l=2&u=','&title=',''],  
		['digg',	'http://digg.com/submit?phase=2&url=','&title=',''],  
		['webnews',	'http://www.webnews.de/einstellen?url=','',''],  
		['yigg',	'http://www.yigg.de/neu?exturl=','&title=',''],  
		['live.com','https://favorites.live.com/quickadd.aspx?marklet=1&mkt=en-us&url=','',''],  
		['mister-wong','http://www.mister-wong.de/index.php?action=addurl&bm_url=','&bm_description=',''],  
		['yahoo',	'http://myweb2.search.yahoo.com/myresults/bookmarklet?u=','&t=',''],  
	],  
	init: function(){  
		this.href = encodeURIComponent(location.href);  
//		this.href = encodeURIComponent('http://forum.de.selfhtml.org/my/?t=192863&m=1287574');  
		this.title =  
			encodeURIComponent(document.getElementsByTagName('head')[0].getElementsByTagName('title')[0].innerHTML);  
		document.getElementsByTagName('style')[0].firstChild.data +=  
			'.bookmarkbar { height:23px; width:253px; margin:0; padding:0; list-style:none; background:#ccc url(social_bookmark.png);}\n'  
			+'.bookmarkbar li {float:left; width:21px; height:23px; margin:0; padding:0; }\n'  
			+'.bookmarkbar a {display:block; overflow:hidden; text-indent:-500px;}\n'  
			+'.bookmarkbar li:hover {outline:1px solid red;}\n';  
		var t='';  
		for(var i=0; i<this.serv.length;i++ ){  
			t 	+= '<li><a href="'  
				+ this.serv[i][1]+this.href  
				+ (this.serv[i][2] ? this.serv[i][2]+this.title : '')  
				+ (this.serv[i][3] ? this.serv[i][3] : '' )  
				+ '" '  
				+ 'title="'+this.serv[i][0]+'" '  
				+ '>'+this.serv[i][0]+'</a></li>';  
		}  
		document.getElementsByClassName('bookmarkbar')[0].innerHTML += t ;  
	},  
}  
  
window.onload = function(){ bookmarkbar.init() };  
</script>  
</head>  
<body>  
<ul class="bookmarkbar"></ul>  
</body>  
</html>  
  

mfg Beat

--
><o(((°>           ><o(((°>
   <°)))o><                     ><o(((°>o
Der Valigator leibt diese Fische
  1. Hallo,

      
    .  
    .  
    .  
     		['live.com','https://favorites.live.com/quickadd.aspx?marklet=1&mkt=en-us&url=','',''],  
     		['mister-wong','http://www.mister-wong.de/index.php?action=addurl&bm_url=','&bm_description=',''],  
     		['yahoo',	'http://myweb2.search.yahoo.com/myresults/bookmarklet?u=','&t=',''],  
      
    Mich dünkt, dieses Komma  ^ ist zuviel.  
      
    
    

    Viele Grüße,
    Jörg

    1. Äh...hätte ich mal die Vorschau benutzt :)

      Ich meinte das abschliessende Komma hinter dem yahoo-Array.

    2. Hallo,

      .
      .
      .
      ['live.com','https://favorites.live.com/quickadd.aspx?marklet=1&mkt=en-us&url=','',''],
      ['mister-wong','http://www.mister-wong.de/index.php?action=addurl&bm_url=','&bm_description=',''],
      ['yahoo', 'http://myweb2.search.yahoo.com/myresults/bookmarklet?u=','&t=',''],

      Mich dünkt, dieses Komma  ^ ist zuviel.

        
      OK. Durch die Entfernung dieses Fehlers ist nun ein anderer sichtbar geworden.  
        
      document.getElementsByTagName('style')[0].firstChild.data +=  
        
      MSIE motzt: is Null or not an object.  
        
      wenn ich das ändere:  
        
      document.getElementsByTagName('style')[0].innerHTML +=  
        
      dann habe ich einen 'unknown runtime error'  
        
      mfg Beat
      
      -- 
      
      ><o(((°>           ><o(((°>  
      
         <°)))o><                     ><o(((°>o  
      Der Valigator leibt diese Fische
      
      1. Hallo,

        document.getElementsByTagName('style')[0].firstChild.data +=

        MSIE motzt: is Null or not an object.

        wenn ich das ändere:

        document.getElementsByTagName('style')[0].innerHTML +=

        dann habe ich einen 'unknown runtime error'

        Ich meine mich zu erinnern, dass der IE mit "firstChild" insofern Zicken macht, als dass er Zeilenumbrüche, Leerzeichen usw. als eigenständige Textknoten auffasst. "firstChild" könnte sich daher auf das falsche Element beziehen.

        Warum dann allerdings innerHTML nicht geht ist komisch.

        Was sagt denn z.b. ein:

          
        var styles = document.getElementsByTagName('style');  
        alert(styles.length);  
        
        

        ?

        1. Ich nochmal.

          Warum dann allerdings innerHTML nicht geht ist komisch.

          Gar nicht so komisch offenbar...

          innerHTML - "The property is read/write for all objects except the following, for which it is read-only: COL, COLGROUP, FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR."

          => Also kein innerHTML für das Style-Element. Musst Du mit den "echten" DOM-Methoden machen.

        2. Was sagt denn z.b. ein:

          var styles = document.getElementsByTagName('style');
          alert(styles.length);

            
          "1"  
            
          Nee das Problem ist \_schreiben\_.  
          egal ob mit innerHTML oder mit DOM Methoden.  
          <http://www.quirksmode.org/dom/w3c_css.html>  
            
          mfg Beat
          
          -- 
          
          ><o(((°>           ><o(((°>  
          
             <°)))o><                     ><o(((°>o  
          Der Valigator leibt diese Fische
          
  2. Hallo,

    Ich meinte das abschliessende Komma hinter dem yahoo-Array.

    Richtig, und es fehlen auch Semikolons, z.B. in den letzten beiden Zeilen (nicht ganz so wichtig).

    Die Pluszeichen bei t an den Zeienanfängen sind nicht gut (gehören ans Zeilenende).
    Auch folgendes wäre nämlich gültige Syntax, ist aber wohl nicht gemeint:

          t   += '<li><a href="';  
            + this.serv[i][1]+this.href;  
            + (this.serv[i][2] ? this.serv[i][2]+this.title : '');  
            + (this.serv[i][3] ? this.serv[i][3] : '' );  
            + '" ';  
            + 'title="'+this.serv[i][0]+'" ';  
            + '>'+this.serv[i][0]+'</a></li>';  
    
    

    Der Parser muss hier also raten, was es wohl sein soll.

    Ansonsten:

    • JS würde ich auslagern, Das hat im HTML nichts zu suchen.
    • CSS würde ich auslagern. Das hat im JS nichts zu suchen.

    Gruß, Don P

  3. Hallo,

    BTW würde mich eure Meinung zu diesem kleinen Social Bookmark Script interessieren.
    Stichwort Codequalität.

    OK:

    »» 		this.title =  
    
    > 			encodeURIComponent(document.getElementsByTagName('head')[0].getElementsByTagName('title')[0].innerHTML);  
    
    

    Den Fenstertitel bekommst du viel einfacher mit document.title.

    Gruß, Don P

    1. »» this.title =

        	encodeURIComponent(document.getElementsByTagName('head')[0].getElementsByTagName('title')[0].innerHTML);  
      
      
      > Den Fenstertitel bekommst du viel einfacher mit `document.title`{:.language-javascript}.  
        
      Danke.  
        
      MSIE hat definitiv mit beiden versionen Probleme  
        
      document.getElementsByTagName('style')[0].firstChild.data +=  
        
      (NULL or not an object)  
      oder  
        
      document.getElementsByTagName('style')[0].innerHTML +=  
      (unknown error)  
        
      Also der Zugriff auf das style Element im head ist hier gemeint.  
        
      mfg Beat
      
      -- 
      
      ><o(((°>           ><o(((°>  
      
         <°)))o><                     ><o(((°>o  
      Der Valigator leibt diese Fische
      
  4. Ich habe jetzt

      document.getElementsByTagName('style')[0].firstChild.data +=  
    

    '.....';

    ersetzt durch:

    var s = document.createElement('style');  
    s.type = 'text/css';  
    s.innerHTML = '#bookmarkbar { height:23px; width:253px; margin:0; padding:0; list-style:none; background:#ccc url(social_bookmark.png);}\n'  
    	+'#bookmarkbar li {float:left; width:21px; height:23px; margin:0; padding:0; }\n'  
    	+'#bookmarkbar a {display:block; overflow:hidden; text-indent:-500px;}\n'  
    	+'#bookmarkbar li:hover {outline:1px solid red;}\n';  
    document.getElementsByTagName('head')[0].appendChild(s);  
      
    
    ~~~das erscheint mir konzeptionell besser.  
    Das MSIE Problem bleibt aber. Bei  
          s.innerHTML  
    streikt er mit einem unknown error.  
      
    mfg Beat
    
    -- 
    
    ><o(((°>           ><o(((°>  
    
       <°)))o><                     ><o(((°>o  
    Der Valigator leibt diese Fische
    
    1. Das MSIE Problem bleibt aber. Bei
            s.innerHTML
      streikt er mit einem unknown error.

      Das ist ja auch kein HTML innerhalb von style.

      Struppi.

      1. Das MSIE Problem bleibt aber. Bei
              s.innerHTML
        streikt er mit einem unknown error.

        Das ist ja auch kein HTML innerhalb von style.

        Falsche Fehleranalyse.
        MSIE kann schlicht das sytyle Element nicht beschreiben.

        Hier die Dom-Methoden Version.

        var s = document.createElement('style');  
        s.type = 'text/css';  
        var x = document.createTextNode(  
          '#bookmarkbar { height:23px; width:253px; margin:0; padding:0; list-style:none; background:#ccc url(social_bookmark.png);}\n'  
          +'#bookmarkbar li {float:left; width:21px; height:23px; margin:0; padding:0; }\n'  
          +'#bookmarkbar a {display:block; overflow:hidden; text-indent:-500px;}\n'  
          +'#bookmarkbar li:hover {outline:1px solid red;}\n');  
        s.appendChild(x);  
        document.getElementsByTagName('head')[0].appendChild(s);  
        
        

        same error

        mfg Beat

        --

           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische