Scénario:
J'ai un menu contenant des liens:
Main Menu Item
--------------
Sub: Show Grid > SubSub: <a>Show #first</a>
<a>Show #second</a>
<a>Show #third</a>
Maintenant, j'ai besoin de trouver tous les divs avec un #ID
CSS qui sont des éléments DOM de premier niveau à l'intérieur du .container
div. Ces éléments doivent être ajoutés à "Sub: Show Grid" et ajouter une classe en cliquant dessus.
<!-- The mark up -->
<div class="container">
<div id="first">1st</div>
<div id="second">2nd</div>
<div id="third">3rd</div>
</div>
Question:
#ID
(non défini/inconnu) avec jQuery?Merci d'avance!
Éditer # 1
Pour clarifier ce que j'essaie de faire - En pseudo-code:
$divs_received_from_jquery_fn = 'how do I get the divs (IDs?) as array(?) and interact with them in the following code?';
foreach ( $divs_received_from_jquery_fn as $div )
{
add_menu_item( array(
'parent' => 'Sub: Show Grid'
,'name' => 'Show #'.$div
,'href' => ''
,'meta' => array(
'onclick' => 'jQuery(".container #".$div).toggleClass("showgrid");'
)
) );
}
Modifier # 2
Le "monde réel" exemple. La sortie est un événement onclick pour un a-link. Mon problème est que je veux appeler la fonction foreach
pour chaque div[id]
sous le div .container
et que je ne sais tout simplement pas comment interagir correctement avec javascript et php.
?>
<script type="text/javascript">
jQuery(".container > div[id]").each(function(){
var context = $(this);
<?php
// SHOWGRID - parts
// @since v0.3
$wp_admin_bar->add_menu( // trigger the function via the global $wp_admin_bar var that calls the class
array(
'parent' => 'showgrid' // parent menu item
,'id' => 'showgrid - ' + this.id // menu item ID
,'title' => sprintf( // menu item label
__( '%1$s show grid parts %2$s%3$s', OXO_TEXTDOMAIN )
,'<span style="background: none;">'
,'<span class="showgridparts-on hide">✔</span>'
,'<span class="showgridparts-off">×</span>'
)
,'href' => '' // stays empty to not trigger anything
,'meta' => array( // HERE GOES THE ACTUAL jQuery FUNCTION
'onclick' => 'jQuery("#" + this.id).toggleClass("showgrid"); jQuery(".showgridparts-on").toggleClass("hide"); jQuery(".showgridparts-off").toggleClass("hide"); return false;'
)
)
);
?>
});
</script>
<?php
$(".container > #first");
ou
$(".container").children("#first");
ou puisque les identifiants doivent être uniques dans un seul document:
$("#first");
Le dernier est bien sûr le plus rapide.
Puisque vous dites que vous ne connaissez pas leur ID, les deux premiers sélecteurs supérieurs (où #first
est écrit) peuvent être modifiés en:
$(".container > div");
$(".container").children("div");
Le dernier (parmi les trois premiers sélecteurs) qui utilise uniquement l’ID n’est bien entendu pas modifiable de cette façon.
Si vous devez également filtrer uniquement les éléments enfants DIV
qui définissent l'attribut ID, écrivez les sélecteurs de la manière suivante:
$(".container > div[id]");
$(".container").children("div[id]");
Ajoutez le code suivant pour attacher le gestionnaire de clics à l’un de vos sélecteurs préférés:
// use selector of your choice and call 'click' on it
$(".container > div").click(function(){
// if you need element's ID
var divID = this.id;
cache your element if you intend to use it multiple times
var clickedDiv = $(this);
// add CSS class to it
clickedDiv.addClass("add-some-class");
// do other stuff that needs to be done
});
Je voudrais également vous indiquer Spécification de sélecteur CSS3 utilisée par jQuery. Cela vous aidera beaucoup à l'avenir car il se peut que certains sélecteurs ne soient pas du tout au courant et pourraient vous rendre la vie beaucoup plus facile.
Je ne suis pas tout à fait sûr de savoir ce que vous recherchez, même si vous avez écrit un pseudo-code ... En tout cas. Certaines parties peuvent encore être répondues:
$(".container > div[id]").each(function(){
var context = $(this);
// get menu parent element: Sub: Show Grid
// maybe I'm not appending to the correct element here but you should know
context.appendTo(context.parent().parent());
context.text("Show #" + this.id);
context.attr("href", "");
context.click(function(evt){
evt.preventDefault();
$(this).toggleClass("showgrid");
})
});
les derniers usages context
pourraient être combinés en un seul enchaîné:
context.text(...).attr(...).click(...);
Vous pouvez toujours obtenir l'élément DOM sous-jacent à partir du jeu de résultats jQuery.
$(...).get(0)
// or
$(...)[0]
vous obtiendrez le premier élément DOM de l'ensemble de résultats jQuery. Le résultat de jQuery est toujours un ensemble d'éléments même s'il n'y en a aucun ou qu'un seul.
Mais lorsque j'ai utilisé la fonction .each()
et fourni une fonction anonyme qui sera appelée sur chaque élément de l'ensemble, le mot clé this
fait en réalité référence à l'élément DOM.
$(...).each(function(){
var DOMelement = this;
var jQueryElement = $(this);
...
});
J'espère que cela efface certaines choses pour votre.
Pour obtenir tous les divs sous 'conteneur', utilisez ce qui suit:
$(".container>div") //or
$(".container").children("div");
Vous pouvez stipuler un #id
spécifique au lieu de div
pour en obtenir un.
Vous dites que vous voulez une div avec un identifiant 'non défini'. Si je vous ai bien compris, voici ce que vous obtiendrez:
$(".container>div[id=]")
Pour définir la classe lorsque vous cliquez sur un div immédiatement dans l'élément .container, vous pouvez utiliser:
<script>
$('.container>div').click(function () {
$(this).addClass('whatever')
});
</script>
De http://api.jquery.com/jQuery/
Contexte du sélecteur Par défaut, les sélecteurs effectuent leurs recherches dans le DOM à partir de la racine du document. Cependant, un autre contexte peut être défini pour la recherche en utilisant le second paramètre facultatif de la fonction $ (). Par exemple, pour effectuer une recherche dans un gestionnaire d'événements, vous pouvez limiter la recherche de la manière suivante:
$( "div.foo" ).click(function() {
$( "span", this ).addClass( "bar" );
});
Lorsque la recherche du sélecteur de plage est restreinte à son contexte, seules les plages de l'élément cliqué obtiendront la classe supplémentaire.
Donc, pour votre exemple, je suggérerais quelque chose comme:
$("div", ".container").each(function(){
//do whatever
});