2009-06-11 6 views
5

J'ai une table, et quand l'utilisateur clique sur chaque cellule, certains détails devraient apparaître dans une petite div pop-up qui apparaît là où l'utilisateur a cliqué. J'utilise JQuery, mais pas pour lier la fonction à l'événement onclick.event.pageX - Utiliser l'événement JQuery dans une fonction non liée à JQuery?

function detailPopup(cell, event, groupName, groupID, ...) 
{ 
    var newDiv = document.createElement("div"); 
    newDiv.id = "detailPop" + groupID; 
    newDiv.className = "priceDetailPopup"; 
    newDiv.innerHTML = "<p>" + groupName + "</p>"; // more will go here 
    $(newDiv).click(function() 
     { 
      $(this).fadeOut("fast").remove(); 
     } 
    ); 
    $("#main").append(newDiv); 
    $(newDiv).css({"left" : event.pageX, "top" : event.pageY}).fadeIn("fast"); 
} 

Tout fonctionne à merveille dans FF, Safari et Chrome. Dans IE, tout fonctionne sauf que la div de détail apparaît sous la table. event.pageX/Y ne fonctionnent pas. Je sais que JQuery corrigera ceux pour IE si je lie la fonction par JQuery comme ceci:

$(cell).click(function(e) { ... e.pageX ... }) 

Mais je ne peux pas faire cela. (Je ne pense pas que je peux - si vous le faites, s'il vous plaît expliquer comment je peux obtenir six variables dans cette fonction sans avoir à utiliser des étiquettes non-xhtml dans la cellule.)

Y at-il un moyen d'avoir JQuery? "l'objet d'événement sans lier la fonction à travers JQuery? $ JQuery.fixEvent (event); ou quelque chose? Je ne trouve aucune référence pour le faire sur leur site.

Merci beaucoup à l'avance.

Répondre

12
e = jQuery.event.fix(e); //you should rename your event parameter to "e" 

Je trouve la fonction fix en effectuant une recherche dans le code source jQuery.

Sinon, vous pouvez l'utiliser pour obtenir la souris sans coordonnées ... jQuery

var posx = 0; 
var posy = 0; 
if (!e) var e = window.event; 
if (e.pageX || e.pageY) { 
    posx = e.pageX; 
    posy = e.pageY; 
} 
else if (e.clientX || e.clientY) { 
    posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; 
    posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; 
} 

Via PPK: http://www.quirksmode.org/js/events_properties.html

+0

Cela fonctionne, mais j'espère qu'il est possible d'utiliser la fonctionnalité existante de jQuery. –

+0

Mmmmk J'ai mis à jour ma réponse :) –

+0

C'est tout! Deux bonnes réponses en une. Merci! –

-1

Vous trouverez peut-être que le problème que vous rencontrez est pas problème de positionnement du tout. En fonction de la syntaxe que vous avez publiée, vous pouvez rencontrer un bug IE lié à l'utilisation du sélecteur d'ID CSS.

$("#main").append(newDiv); 

Si IE ne reconnaît pas l'élément "#main", la fonction append() ne fonctionnera pas correctement. IE (pré-v7) a un support irrégulier pour le sélecteur ID (#). Au lieu de cela, essayez:

$('div[id="main"]').append(newDiv); 

Essayez ceci et faites-moi savoir comment cela fonctionne pour vous.

+0

Merci, mais cela ne le fait pas. event.pageX/Y sont définitivement indéfinis. J'ai confirmé cela en les alertant. –

+0

L'utilisation de l'ID est le moyen le plus simple d'obtenir un élément, et il est pris en charge depuis les anciennes versions d'Internet Explorer. Il n'y a aucun moyen que IE a vissé ça. Soit fournir un lien qui sauvegarde votre demande, ou j'appelle BS! –

+0

Je n'ai pas dit que ce n'était pas supporté. J'ai dit qu'il avait un soutien inégal. Et je ne présume pas que l'exemple de code affiché par le demandeur est le code exact du projet. (Habituellement, il est nettoyé pour l'affichage public et la simplification) http: //reference.sitepoint.com/css/idselector "Dans Internet Explorer 6, un sélecteur d'ID est ignoré sauf s'il s'agit du dernier sélecteur d'ID du sélecteur simple". Les symptômes ici semblaient cohérents avec l'élément en ligne et non "attaché" à un élément existant. Ça valait le coup d'essayer. Désolé ce n'était pas la solution simple que j'espérais pour vous, Scott. –