111

I'm trying to select all elements that have a data-go-to attribute that is not empty.

I've tried $('[data-go-to!=""]') but oddly enough it seems to be selecting every single element on the page if I do that.

userlond
  • 3,632
  • 2
  • 36
  • 53
Shpigford
  • 24,748
  • 58
  • 163
  • 252

11 Answers11

211

Just as further reference, and an up-to-date (may'14) (aug'15) (sep'16) (apr'17) (mar'18) (mar'19) (may'20) (jan'22)...
Answer that works with:

###Empty strings: If the attr must exist & could have any value (or none at all)

    jQuery("[href]");

###Missing attributes: If attr could exist & if exist, must have some value

    jQuery("[href!='']");

###Or both: If attr must exist & has to have some value...

    jQuery("[href!=''][href]");

PS: more combinations are possible...


###Check this test in jsFiddle for examples:


###Or here in SO with this Code Snippet.
* Snippet is running jQuery v2.1.1

jQuery('div.test_1 > a[href]').addClass('match');
jQuery('div.test_2 > a[href!=""]').addClass('match');
jQuery('div.test_3 > a[href!=""][href]').addClass('match');
div,a {
    display: block;
    color: #333;
    margin: 5px;
    padding: 5px;
    border: 1px solid #333;
}
h4 {
    margin: 0;
}
a {
    width: 200px;
    background: #ccc;
    border-radius: 2px;
    text-decoration: none;
}
a.match {
    background-color: #16BB2A;
    position: relative;
}
a.match:after {
    content: 'Match!';
    position: absolute;
    left: 105%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="test_1">
    <h4>Test 1: jQuery('a[href]')</h4>
    <a href="test">href: test</a>
    <a href="#">href: #</a>
    <a href="">href: empty</a>
    <a>href: not present</a>
</div>
<div class="test_2">
    <h4>Test 2: jQuery('a[href!=""]')</h4>
    <a href="test">href: test</a>
    <a href="#">href: #</a>
    <a href="">href: empty</a>
    <a>href: not present</a>
</div>
<div class="test_3">
    <h4>Test 3: jQuery('a[href!=""][href]')</h4>
    <a href="test">href: test</a>
    <a href="#">href: #</a>
    <a href="">href: empty</a>
    <a>href: not present</a>
</div>
gmo
  • 8,860
  • 3
  • 40
  • 51
80

try

$(':not([data-go-to=""])')

UPDATE:

For the sake of not leading anyone astray, this answer will work in older versions of jQuery but is not future-proof. Since @gmo and @siva's answers both seem to be working with later versions I defer to (and encourage you to upvote) their answers....and of course hope you have a fantastic day.

Benjamin Oman
  • 1,654
  • 1
  • 17
  • 19
  • thanks, this worked great! I wanted to select only image elements, so I added $(':not(img[data-go-to==""]') – msanjay Jul 04 '12 at 07:34
  • 2
    Does this not select all elements that don't have a blank 'data-to-go' attribute? When the asker wants all elements with that attribute that are not blank? (as Siva Charan's answer resolves) – rodnaph Sep 06 '13 at 09:21
  • don't really need any double quotes either... as in `$('element:not([attribute=])'); // gets all of ` or `$(':not([attribute=])'); // gets all of <* attribute="">` – Anthony Hatzopoulos Mar 21 '14 at 01:24
  • 2
    This gets every element for me, including the one that has the data-attribute I'm looking for –  May 29 '14 at 16:34
  • Doesn't seem to work in Safari but `$('[data-go-to!=""]:[data-go-to]')` does. – Dan Mar 02 '15 at 20:56
  • Can't make this working with jquery 1.10 (it founds 100+ results where I want only one) but gmo answer below is working ( `$("[data-go-to!=''][data-go-to]")` ) – Matthieu Charbonnier Nov 03 '15 at 10:21
  • why not future proof? – Simon_Weaver May 23 '17 at 20:30
20
$('[data-go-to!=""]:[data-go-to]').each(function() {
    // Do Your Stuff
});​
Siva Charan
  • 17,940
  • 9
  • 60
  • 95
9

Has 'data-attributename' and its value is not empty:

$('[data-attributename]:not([data-attributename=""])')

Has 'data-attributename' empty or not:

$('[data-attributename]')

JS Fiddle example

Jelgab
  • 1,840
  • 19
  • 12
5

I'm not sure about a simple selector, but you could use filter():

$('[data-go-to]').filter(
    function(){
        return ($(this).attr('data-go-to').length > 0);
    });

JS Fiddle demo.

References:

David Thomas
  • 249,100
  • 51
  • 377
  • 410
4

According to the documentation this should do it

:not([attr="value"])

DEMO

Hope this helps

Dhiraj
  • 33,140
  • 10
  • 61
  • 78
3
$('[data-go-to]:not([data-go-to=""])')

JSBIN

Shanimal
  • 11,517
  • 7
  • 63
  • 76
2
$('[data-go-to]').filter(function() {
    return $(this).data('go-to')!="";
});

Using :not, .not(), :empty etc will only check if the element itself is empty, not the data attribute. For that you will have to filter based on the data attributes value.

FIDDLE

adeneo
  • 312,895
  • 29
  • 395
  • 388
1

This works for me

$('[attributename]').filter('[attributename!=""]')
Mardok
  • 624
  • 8
  • 18
0

Try this :

$('[data-go-to:not(:empty)]')
Pascal Boutin
  • 1,220
  • 2
  • 9
  • 22
  • 1
    No go. `"Syntax error, unrecognized expression: [data-go-to:not(:empty)]"` – Shpigford May 17 '12 at 18:19
  • http://api.jquery.com/empty-selector/ http://api.jquery.com/not-selector/ According to this, would be suppose to work, sad, that would have been a clean solution ! – Pascal Boutin May 17 '12 at 18:23
0

This works for me:

$('.data .title td[data-field!=""]')
cn007b
  • 16,596
  • 7
  • 59
  • 74