简体   繁体   中英

jquery plugin set value of this

I am creating star rating box... my php page is as below

<html>
<head>
  <script src='jquery.js'></script>
  <script src='alamStars.js'></script>
  <script>
    $().ready(function(){
       $("#txtStar").alamStar();
    });
  </script>

</head>
<body>
<?php
 if(isset($_GET[]))
 {
   echo $_GET['txtStar'];
 }
?>
 <form>
  <input type='text' name='txtStar' id='txtStar'>
  <input type='submit'>
 </form>
</body>
</html>

my plugin code is as below

;(function ($) {
  $.fn.alamStar = function (options) {       
    var defaultVal = {
        img: '../images/start_rating.png',
        width: 105,
        height: 120
    }; //end array of default values

    var obj = $.extend(defaultVal, options);//overwrite default values if there
    this.after("<div id='alamStarBox' stars='"+this.val()+"'></div>");//dynamically create div
    var alamStarBox=$("#alamStarBox");//assign alamStarBox to a variable
    alamStarBox.html(this.val());//set initial value from textbox

    alamStarBox.css({
        'color'             :   'red',
        'background-image'  :   'url('+obj.img+')',
        'max-width'         :   obj.width+"px",
        'max-height'        :   obj.height+"px",
        'overflow'          :   'hidden'
    });//end styling css to alamStarBox

    alamStarBox.mousemove(function(e){
    var l=alamStarBox.offset().left;//Left value of alaStarBox
    var c=parseInt(e.pageX)+21;//current-position

    if(c>(parseInt(l)+parseInt(10)))
    {
        $(this).html("0");
        $(this).css('background-position-Y','0px');
    }
    if(c>(parseInt(l)+parseInt(30)))
    {
        $(this).html("1");
        $(this).css('background-position-Y','-20px');
    }
    if(c>(parseInt(l)+parseInt(50)))
    {
        $(this).html("2");
        $(this).css('background-position-Y','-40px');
    }
    if(c>(parseInt(l)+parseInt(70)))
    {
        $(this).html("3");
        $(this).css('background-positionY','-60px');
    }
    if(c>(parseInt(l)+parseInt(90)))
    {
        $(this).html("4");
        $(this).css('background-positionY','-80px');
    }
    if(c>(parseInt(l)+parseInt(110)))
    {
        $(this).html("5");
        $(this).css('background-positionY','-100px');
    }
});//end moue move function

alamStarBox.mouseout(function(){
    var p=parseInt($(this).attr("stars"))*20;
    $(this).css('background-positionY','-'+p+'px');
    $(this).html($(this).attr("stars"));
});//end function alamStarBox mouseOut

alamStarBox.click(function(){
    $(this).attr("stars",$(this).text());
});//end function alamStarBox click

var frm=this.closest("form");
frm.submit(function(){
    this.val(alamStarBox.text());//on submit form copy text from starbox to textBox
    //////////////////////////////////the above line is not working////////////////
});

 };//end alamStar function
})(jQuery);

I want to set textbox value equal to div text, in last function named frm.submit
but it is not working even assigning it static string like "static value"

You have to save the copy of this in the parent function into another variable that you can then refer to in the callback function like this:

var self = this;
var frm = this.closest("form");
frm.submit(function(){
    self.val(alamStarBox.text());  //on submit form copy text from starbox to textBox
});

This happens because inside the submit callback function this will have a different value (most likely it will be the form DOM object). Using a local variable named self or that or me is a very common design pattern for allowing a reference to the original object inside a local callback function.

You are using a callback on the jQuery .submit method of the form, so this is most likely not what you think it is (log it to console to see what it actually is).

Even $(this) will not work here, because that would be the form itself – and calling .val() on that makes no sense.

Select the input field explicitly in this function, then it should work: $("#txtStar").val(…)

Either you use jfriend00's suggestion or you can use $.proxy() which change the scope of the submit hanlder to the original "this" value.

frm.submit($.proxy(function(){
    this.val(alamStarBox.text());   // NOW this=your textbox #txtStar
}, this));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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