2010-12-02 90 views
0

Je fait un bookmarklet pour replier chaque ligne d'une table, à l'exception du premier, puis faire la première rangée bascule/montrer le reste de la table:bookmarklet ouvre de façon inattendue nouvelle page, cliquez

javascript:(function(){ 

function open(tableid){ 
    console.log('open'); 
    for (j=1;j<table[tableid].rows.length;j++){ 
     if(table[tableid].rows[j].style.display == 'none'){ 
     table[tableid].rows[j].style.display = ''; 
     } else if(table[tableid].rows[j].style.display == ''){ 
     table[tableid].rows[j].style.display = 'none'; 
     } 
    } 
} 
var table = document.getElementsByTagName("table"); 
for (i=0;i<table.length;i++){ 
for (j=0;j<table[i].rows.length;j++){ 
    if(j != 0){ 
    table[i].rows[j].style.display = 'none'; 

    } 
    if(j == 0){ 
    table[i].rows[j].onclick = new Function("open("+i+")"); 
    } 
    } 
} 
})(); 

I lancez ceci sans javascript: (function() {}() dans la console de firebug, et ça marche bien, mais quand je l'utilise comme bookmarklet, chaque fois que je clique sur la première ligne pour afficher la table, ça ouvre juste une nouvelle le '0' (ie website.com/0)

Répondre

2

le constructeur de fonction crée une fonction globale, pas lexicalement dans votre fonction. il n'a pas accès à votre fonction locale appelée open, il utilise donc la méthode open de la fenêtre. De mes tests, votre code doit toujours référencer la méthode ouverte globale, qu'elle soit exécutée à partir d'un bookmarklet ou de la page elle-même.

Regardez cet exemple:

(function(){ 
    function giveme5(x) { return 5;} 

    var func = new Function("return giveme5()"); 
    // should output 5, but we get an error, giveme5 is not defined 
    console.log(func()); 
})() 

Voici une solution à votre problème

(function(){ 
    // Binds an argument to a method, this could be much better, but serves our 
    // purpose here 
    function bindArg(fun, arg) { 
     return function() { 
      fun.call(this, arg); 
     } 
    } 

    function toggleTable(table) { 
     var rows = table.rows; 
     for (var j=1; j<rows.length; j++){ 
      if(rows[j].style.display == 'none'){ 
       rows[j].style.display = ''; 
      } else if(rows[j].style.display == ''){ 
       rows[j].style.display = 'none'; 
      } 
     } 
    } 

    var tableList = document.getElementsByTagName("table"); 
    for (var i=0; i<tableList.length; i++){ 
     var table = tableList[i]; 
     for (var j=0; j < table.rows.length;j++){ 
      if(j != 0){ 
       table.rows[j].style.display = 'none'; 
      } else { 
       table.rows[j].onclick = bindArg(toggleTable, table); 
      } 
     } 
    } 
})();