194

How do I use JavaScript variables as a parameter in a jQuery selector?

<script type="text/javascript">
$(function(){    
  $("input").click(function(){
    var x = $(this).attr("name");

    $("input[id=x]").hide();    
  });    
});
</script>

<input type="text" id="bx"/><input type="button" name="bx"/>
<input type="text" id="by"/><input type="button" name="by"/>

Basically what I want to do is to be able to hide the element which has an id that is equal to the name of the element that is being clicked.

6 Answers 6

292
var name = this.name;
$("input[name=" + name + "]").hide();

OR you can do something like this.

var id = this.id;
$('#' + id).hide();

OR you can give some effect also.

$("#" + this.id).slideUp();

If you want to remove the entire element permanently form the page.

$("#" + this.id).remove();

You can also use it in this also.

$("#" + this.id).slideUp('slow', function (){
    $("#" + this.id).remove();
});
Sign up to request clarification or add additional context in comments.

2 Comments

It's important to note that the variable used to concatenate must be non-numerical, so do toString() if id is a number.
This is actually incorrect with . and :. See jQuery selector value escaping - Stack Overflow.
59
$(`input[id="${this.name}"]`).hide();

As you're using an ID, this would perform better

$(`#${this.name}`).hide();

I highly recommend being more specific with your approach to hiding elements via button clicks. I would opt for using data-attributes instead. For example

<input id="bx" type="text">
<button type="button" data-target="#bx" data-method="hide">Hide some input</button>

Then, in your JavaScript

// using event delegation so no need to wrap it in .ready()
$(document).on('click', 'button[data-target]', function() {
    var $this = $(this),
        target = $($this.data('target')),
        method = $this.data('method') || 'hide';
    target[method]();
});

Now you can completely control which element you're targeting and what happens to it via the HTML. For example, you could use data-target=".some-class" and data-method="fadeOut" to fade-out a collection of elements.

Comments

15
$("input").click(function(){
        var name = $(this).attr("name");
        $('input[name="' + name + '"]').hide();    
    });   

Also works with ID:

var id = $(this).attr("id");
$('input[id="' + id + '"]').hide();

when, (sometimes)

$('input#' + id).hide();

does not work, as it should.

You can even do both:

$('input[name="' + name + '"][id="' + id + '"]').hide();

Comments

8
var x = $(this).attr("name");
$("#" + x).hide();

Comments

5

$("#" + $(this).attr("name")).hide();

Comments

2
  1. ES6 String Template

    Here is a simple way if you don't need IE/EDGE support

    $(`input[id=${x}]`).hide();
    

    or

    $(`input[id=${$(this).attr("name")}]`).hide();
    

    This is a es6 feature called template string

        (function($) {
            $("input[type=button]").click(function() {
                var x = $(this).attr("name");
                $(`input[id=${x}]`).toggle(); //use hide instead of toggle
            });
        })(jQuery);
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <input type="text" id="bx" />
        <input type="button" name="bx" value="1" />
        <input type="text" id="by" />
        <input type="button" name="by" value="2" />
    
     


  1. String Concatenation

    If you need IE/EDGE support use

    $("#" + $(this).attr("name")).hide();
    

        (function($) {
            $("input[type=button]").click(function() {
                $("#" + $(this).attr("name")).toggle(); //use hide instead of toggle
            });
        })(jQuery);
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <input type="text" id="bx" />
        <input type="button" name="bx" value="1" />
        <input type="text" id="by" />
        <input type="button" name="by" value="2" />
    
     


  1. Selector in DOM as data attribute

    This is my preferred way as it makes you code really DRY

    // HTML
    <input type="text"   id="bx" />
    <input type="button" data-input-sel="#bx" value="1" class="js-hide-onclick"/>
    
    //JS
    $($(this).data("input-sel")).hide();
    

        (function($) {
            $(".js-hide-onclick").click(function() {
                $($(this).data("input-sel")).toggle(); //use hide instead of toggle
            });
        })(jQuery);
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <input type="text" id="bx" />
        <input type="button" data-input-sel="#bx" value="1" class="js-hide-onclick" />
        <input type="text" id="by" />
        <input type="button" data-input-sel="#by" value="2" class="js-hide-onclick" />
    
     

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.