简体   繁体   English

Jquery 变量(点击功能内部)未全局显示

[英]Jquery variable(inside click function) is not showing globally

Hope you are doing right.希望你做得对。 I have a simple code to increase or decrease star ratings & finally stores the result as a variable.我有一个简单的代码来增加或减少星级,最后将结果存储为变量。 But I can not access the variable outside the click function.但是我无法访问 click 函数之外的变量。 I have declared the variable outside the click function.我已经在 click 函数之外声明了变量。 But I am getting the result undefined.但我得到的结果未定义。 I am not getting the $ratingCount outside of the click function.我没有在点击功能之外获得 $ratingCount 。 My code goes like below:我的代码如下:

$(document).ready(function(){
        let $finalRating;
         let $ratingCount; 
//if user wants to increase rating   
        $('.rating-link').on('click', function(){           
            $(this).children('.rating').addClass('fas');
            $(this).children('.rating').removeClass('far');
            $(this).parent('li').prevAll().find('.rating').addClass('fas');
            $(this).parent('li').prevAll().find('.rating').removeClass('far');
//if user wants to lower rating
            $(this).parent('li').prevAll().children('.rating-link').on('click', function(){ 
                $(this).parent('li').nextAll().find('.rating').addClass('far');
                $(this).parent('li').nextAll().find('.rating').removeClass('fas');
            });
            $ratingCount = $(this).parent('li').prevAll().find('.rating').length;                         
        });
        $finalRating = 1 + $ratingCount;  
        console.log($ratingCount);
        console.log($finalRating); 
    });

and HTML is as follows:和 HTML 如下:

<ul>
    <li><span class="rating-link"><i class="far fa-star rating"></i></span></li>
    <li><span class="rating-link"><i class="far fa-star rating"></i></span></li>
    <li><span class="rating-link"><i class="far fa-star rating"></i></span></li>
    <li><span class="rating-link"><i class="far fa-star rating"></i></span></li>
    <li><span class="rating-link"><i class="far fa-star rating"></i></span></li>
</ul>

Really appreciate your solution.非常感谢您的解决方案。

You are able to access the values outside of click event handler.您可以访问 click 事件处理程序之外的值。 It's just that, they are not initialized that's why giving undefined and NaN as output.只是,它们没有初始化,这就是为什么将undefinedNaN作为输出。

Your console is printed only when document ready runs and hence you are unable to get output when the element is clicked.只有在文档ready运行时才会打印console ,因此在单击元素时无法获得输出。

Besides that, you had added a lot of unnecessary code which is not a good practice.除此之外,您添加了许多不必要的代码,这不是一个好习惯。 Have a look at the code below :看看下面的代码:

 $(document).ready(function() { let $finalRating = 0; $('.rating-link').on('click', function() { $(this).find('.rating').addClass('fas').removeClass('far'); var wrap = $(this).parent('li'); wrap.prevAll().find('.rating').addClass('fas').removeClass('far'); wrap.nextAll().find('.rating').addClass('far').removeClass('fas'); $finalRating = wrap.prevAll().addBack().find('.rating').length; console.log($finalRating); }); console.log($finalRating); });
 ul { list-style-type: none; } ul li { display: inline; } .rating-link { cursor: pointer; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/all.min.css"> <ul> <li><span class="rating-link"><i class="far fa-star rating"></i></span></li> <li><span class="rating-link"><i class="far fa-star rating"></i></span></li> <li><span class="rating-link"><i class="far fa-star rating"></i></span></li> <li><span class="rating-link"><i class="far fa-star rating"></i></span></li> <li><span class="rating-link"><i class="far fa-star rating"></i></span></li> </ul>

In $(document).ready(function() , the value of $finalRating is based on the value of $ratingCount ( $finalRating = 1 + $ratingCount; ). As $ratingCount is still undefined at that point, you won't see a value for either of them.$(document).ready(function()$finalRating的值基于$ratingCount ( $finalRating = 1 + $ratingCount; ) 的值。由于此时$ratingCount仍未undefined ,因此您不会查看其中任何一个的值。

I think it is important to consider the order in which the code runs.我认为考虑代码运行的顺序很重要。 All of $(document).ready(function() will run first, then, some time after that, when the user clicks on one of the <li> elements, the function $('.rating-link').on('click', function() will run.所有$(document).ready(function()将首先运行,然后,在此之后的一段时间,当用户单击<li>元素之一时,函数$('.rating-link').on('click', function()将运行。

So the part written after the click event will not happen before any clicking is done, not after.所以在点击事件之后写入的部分不会在任何点击完成之前发生,而不是之后。 To be able to keep track of the values as they change, you may wish to do something like this:为了能够在值更改时跟踪它们,您可能希望执行以下操作:

 $(document).ready(function() { let $finalRating = 1; let $ratingCount = 0; //if user wants to increase rating $('.rating-link').on('click', function() { $(this).children('.rating').addClass('fas'); $(this).children('.rating').removeClass('far'); $(this).parent('li').prevAll().find('.rating').addClass('fas'); $(this).parent('li').prevAll().find('.rating').removeClass('far'); //if user wants to lower rating $(this).parent('li').prevAll().children('.rating-link').on('click', function() { $(this).parent('li').nextAll().find('.rating').addClass('far'); $(this).parent('li').nextAll().find('.rating').removeClass('fas'); }); $ratingCount = $(this).parent('li').prevAll().find('.rating').length; updateFinalRating(); }); function updateFinalRating() { //do something useful with the updated rating here $finalRating = 1 + $ratingCount; console.log('$ratingCount: ' + $ratingCount); console.log('$finalRating: ' + $finalRating); }; });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul> <li><span class="rating-link">Click me! (1)<i class="far fa-star rating"></i></span></li> <li><span class="rating-link">Click me! (2)<i class="far fa-star rating"></i></span></li> <li><span class="rating-link">Click me! (3)<i class="far fa-star rating"></i></span></li> <li><span class="rating-link">Click me! (4)<i class="far fa-star rating"></i></span></li> <li><span class="rating-link">Click me! (5)<i class="far fa-star rating"></i></span></li> </ul>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM