jQuery selector madness

故事扮演 提交于 2019-12-25 01:39:15

问题


The following code performs .css({"background":"black"}); on all elements with class="hole", however I'm trying to get it to do it on elements with class="hole" AND data-hole-key="[hole_key_variable]".

What's missing?

jQuery:

// on elements with class "hole" hovered
$('.hole').hover(
    function(){ 
        // get the data value of the currently hovered element
        var holeKey = $($(this).data('holeKey'));
        // on all elements with that class "hole" and specified data value, change bgcolor
        $('.hole').data(holeKey).css({"background":"black"});
    },
    function(){
        var holeKey = $($(this).data('holeKey'));
        $('.hole').data(holeKey).removeAttr('style');
    }
);

HTML:

<td class="hole" data-hole-key="1">text</td>
<td class="hole" data-hole-key="2">text</td>
<td class="hole" data-hole-key="3">text</td>

BTW, why does this (faulty) code not work at all without double wrapping this line:

var holeKey = $($(this).data('holeKey'));

回答1:


Here's a working jsfiddle of what I believe you're looking for: http://jsfiddle.net/XKs4a/

// on elements with class "hole" hovered
$('.hole').hover(
    function(){
        // get the data value of the currently hovered element
        var holeKey = $(this).data('holeKey');
        // on all elements with that class "hole" and specified data value, change bgcolor
        $('.hole[data-hole-key=' + holeKey + ']').css({"background":"black"});
    },
    function(){
        var holeKey = $(this).data('holeKey');
        $('.hole[data-hole-key=' + holeKey + ']').removeAttr('style');
    }
);

And for this:

var holeKey = $($(this).data('holeKey'));

That would return the key wrapped in jquery, so for the first element you would get $(1)




回答2:


EDIT Rethinking what I think you are trying to do- this first snipped will change the hovered element CSS only

$('.hole').hover(
    function(){ 

    $(this).css({"background":"black"});
    },
    function(){

      $(this).removeAttr('style');
    }
);

WHere your code is causing issues

This part here is not going to return a value because you are wrapping it in jQuery, and the value being wrapped is not a selector

    // get the data value of the currently hovered element
    var holeKey = $($(this).data('holeKey'));

To get the value from element data

    // get the data value of the currently hovered element
    var holeKey = $(this).data('holeKey');

To isolate a $('.hole') based on its data value you could do something like this:

 var testVal=1;

  $('.hole[data-hole-key="'+ testVal+'"]').hover(.....

Or another method using filter()

    var testVal=1;

    $('.hole').filter(function(){
            return $(this).data('data-hole-key')==testVal;                 
    }).hover(....


来源:https://stackoverflow.com/questions/9657749/jquery-selector-madness

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!