2010-06-28 26 views
0

J'utilise Sizzle pour sélectionner différentes parties du DOM.JavaScript - Avoir des problèmes avec un événement click

Mon code est ci-dessous. Le problème est que l'événement onmouseup est déclenché lorsque la page est chargée au lieu de l'interaction de l'utilisateur avec la page.

Quelqu'un peut-il expliquer pourquoi cela est s'il vous plaît.

Merci.

// Effects object 
var effects = { 
    // Display an object 
    show : function(obj) { 
     obj.style.display = 'block'; 
    }, 
    // Hide an object 
    hide : function(obj) { 
     obj.style.display = 'hide'; 
    }, 
    // Toggle 
    toggle : function(obj) { 
     if (obj instanceof Array) { 
      alert('array'); 
     } else { 
      alert('single');  
     } 
    } 
} 

// Selector Class 
var s = Sizzle; 

window.onload = function() { 
    s('#toggle-content').onmouseup = effects.toggle(s('.hidden-content')); 
} 

HTML comme demandé:

<div class="page-content box create-page"> 
    <h1><span class="left">Create Page</span><a class="right" id="toggle-content" href="#">Expand</a></h1> 
    <div class="hidden-content"> 
     ... 
    </div> 
</div> 
+0

Il serait utile que vous affichiez une partie du code HTML que vous souhaitez modifier (les éléments «bascule-contenu» et «contenu caché», par exemple). – Pointy

+0

Ajout de HTML comme demandé. – JasonS

Répondre

1

C'est parce que vous appelez effects.toggle dans l'expression. Vous devriez réellement lier la fonction pour éviter de l'appeler.

 
    function bind() { 
    var initArgs = array(arguments); 
    var fx =  initArgs.shift(); 
    var tObj =  initArgs.shift(); 
    var args =  initArgs; 
    return function() { 
     return fx.apply(tObj, args.concat(array(arguments))); 
    }; 
    } 
    function array(a) { 
    var r = []; for (var i = 0; i < a.length; i++) 
     r.push(a[i]); 
    return r; 
    } 

window.onload = function() { 
    s('#toggle-content').onmouseup = bind(effects.toggle, null, s('.hidden-content')); 
} 
+0

Ceci déclenche une erreur javascript. 'array n'est pas défini' – JasonS

+0

Fixé maintenant. Désolé pour ça! –

3

vous devez le passer comme une fonction anonyme par exemple.

window.onload = function() { 
    s('#toggle-content').onmouseup = function(){effects.toggle(s('.hidden-content'));} 
} 
+0

C'est ce que j'avais essayé à l'origine. Ça ne fait rien. Pas d'erreurs et rien d'alerté dans le navigateur. Lorsque je déplace la fonction ennuyeuse vers une fonction nommée. Alors ayez. s ('# toggle-content'). Onmouseup = toggle(); Il se déclenche quand la page est chargée. – JasonS

+0

en faisant comme ça vous n'avez pas besoin des crochets - c'est pourquoi vous utilisez la fonction anonyme de sorte que vous pouvez passer les paramètres. – matpol