jquery.rating.js
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:7k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  ### jQuery Star Rating Plugin v2.1 - 2008-03-12 ###
  3.  By Diego A, http://www.fyneworks.com, diego@fyneworks.com
  4.  - 'read only' feature by by Keith Wood, http://keith-wood.name/, kbwood@virginbroadband.com.au
  5.  
  6.  Project: http://plugins.jquery.com/project/MultipleFriendlyStarRating
  7.  Website: http://www.fyneworks.com/jquery/star-rating/
  8. This is a modified version of the star rating plugin from:
  9.  http://www.phpletter.com/Demo/Jquery-Star-Rating-Plugin/
  10.  
  11.  //BB: fixed bug with multiple ratings with same name but different forms
  12. */
  13. // ORIGINAL COMMENTS:
  14. /*************************************************
  15.  This is hacked version of star rating created by <a href="http://php.scripts.psu.edu/rja171/widgets/rating.php">Ritesh Agrawal</a>
  16.  It thansform a set of radio type input elements to star rating type and remain the radio element name and value,
  17.  so could be integrated with your form. It acts as a normal radio button.
  18.  modified by : Logan Cai (cailongqun[at]yahoo.com.cn)
  19.  website:www.phpletter.com
  20. ************************************************/
  21. /*# AVOID COLLISIONS #*/
  22. ;if(jQuery) (function($){
  23. /*# AVOID COLLISIONS #*/
  24. // default settings
  25. $.rating = {
  26. cancel: 'Cancel Rating', // advisory title for the 'cancel' link
  27. cancelValue: '',         // value to submit when user click the 'cancel' link
  28. half: false,             // just a shortcut to settings.split = 2
  29. split: 0,                // split the star into how many parts?
  30. required: false,         // disables the 'cancel' button so user can only select one of the specified values
  31. readOnly: false,         // disable rating plugin interaction/ values cannot be changed
  32. // required properties:
  33. groups: {},// allows multiple star ratings on one page
  34.  event: {// plugin event handlers
  35.   fill: function(n, el, state){ // fill to the current mouse position.
  36.   this.drain(n);
  37.   $(el).prevAll('.star').andSelf().addClass('star_'+(state || 'hover'));
  38.   },
  39.   drain: function(n, el, settings) { // drain all the stars.
  40.    $($.rating.groups[n].valueElem).siblings('.star').removeClass('star_on').removeClass('star_hover');
  41.   },
  42.   reset: function(n, el, settings){ // Reset the stars to the default index.
  43.    if (!$($.rating.groups[n].current).is('.cancel'))
  44.    $($.rating.groups[n].current).prevAll('.star').andSelf().addClass('star_on');
  45.   },
  46.   click: function(n, el, settings){ // Selected a star or cancelled
  47. $.rating.groups[n].current = el;
  48. var curValue = $(el).children('a').text();
  49. // Set value
  50. $($.rating.groups[n].valueElem).val(curValue);
  51. // Update display
  52. $.rating.event.drain(n);
  53. $.rating.event.reset(n);
  54. // callback function, as requested here: http://plugins.jquery.com/node/1655
  55. if(settings.callback) settings.callback.apply($.rating.groups[n].valueElem, [curValue, el]);
  56.   }      
  57.  }// plugin events
  58. };
  59. $.fn.rating = function(instanceSettings){
  60. if(this.length==0) return this; // quick fail
  61. instanceSettings = $.extend(
  62.   {}/* new object */,
  63. $.rating/* global settings */,
  64. instanceSettings || {} /* just-in-time settings */
  65. );
  66. // loop through each matched element
  67.  this.each(function(i){
  68. var settings = $.extend(
  69. {}/* new object */,
  70. instanceSettings || {} /* current call settings */,
  71. ($.metadata? $(this).metadata(): ($.meta?$(this).data():null)) || {} /* metadata settings */
  72. );
  73. //console.log([this.name, settings.half, settings.split], '#');
  74. // grouping:
  75. var n = $(this).parents('form').attr('name') + '___' + this.name; //BB changed, was: var n = this.name;
  76. if(!$.rating.groups[n]) $.rating.groups[n] = {count: 0};
  77. i = $.rating.groups[n].count; $.rating.groups[n].count++;
  78. // Accept readOnly setting from 'disabled' property
  79. $.rating.groups[n].readOnly = $.rating.groups[n].readOnly || settings.readOnly || $(this).attr('disabled');
  80. // Things to do with the first element...
  81. if(i == 0){
  82. // Create value element (disabled if readOnly)
  83.  $.rating.groups[n].valueElem = $('<input type="hidden" name="' + this.name + '" value=""' + (settings.readOnly ? ' disabled="disabled"' : '') + '>'); //BB changed: name="n" --> name="this.name"....
  84. // Insert value element into form
  85.    $(this).before($.rating.groups[n].valueElem);
  86.  
  87. if($.rating.groups[n].readOnly || settings.required){
  88.  // DO NOT display 'cancel' button
  89. }
  90. else{
  91. // Display 'cancel' button
  92.   $(this).before(
  93.      $('<div class="cancel"><a title="' + settings.cancel + '">' + settings.cancelValue + '</a></div>')
  94. .mouseover(function(){ $.rating.event.drain(n, this, settings); $(this).addClass('star_on'); })
  95. .mouseout(function(){ $.rating.event.reset(n, this, settings); $(this).removeClass('star_on'); })
  96. .click(function(){ $.rating.event.click(n, this, settings); })   
  97.     ); 
  98. }
  99. }; // if (i == 0) (first element)
  100. // insert rating option right after preview element
  101. eStar = $('<div class="star"><a title="' + (this.title || this.value) + '">' + this.value + '</a></div>');
  102. $(this).after(eStar);
  103. // Half-stars?
  104. if(settings.half) settings.split = 2;
  105. // Prepare division settings
  106.  if(typeof settings.split=='number' && settings.split>0){
  107.  var spi = (i % settings.split), spw = Math.floor($(eStar).width()/settings.split);
  108. $(eStar)
  109. // restrict star's width and hide overflow (already in CSS)
  110. .width(spw)
  111. // move the star left by using a negative margin
  112. // this is work-around to IE's stupid box model (position:relative doesn't work)
  113. .find('a').css({ 'margin-left':'-'+ (spi*spw) +'px' })
  114. };
  115. // readOnly?
  116. if($.rating.groups[n].readOnly){
  117. // Mark star as readOnly so user can customize display
  118. $(eStar).addClass('star_readonly');
  119.   //alert([this.name,this.value,this.checked].join('n'));
  120. }
  121. else{
  122. // Attach mouse events
  123. $(eStar)
  124. .mouseover(function(){ $.rating.event.drain(n, this, settings); $.rating.event.fill(n, this, 'hover'); })
  125. .mouseout(function(){ $.rating.event.drain(n, this, settings); $.rating.event.reset(n, this, settings); })
  126. .click(function(){ $.rating.event.click(n, this, settings); });
  127. };
  128. //if(console) console.log(['###', n, this.checked, $.rating.groups[n].initial]);
  129. if(this.checked) $.rating.groups[n].current = eStar;
  130. //remove this checkbox
  131. $(this).remove();
  132. // reset display if last element
  133. if(i + 1 == this.length) $.rating.event.reset(n, this, settings);
  134. }); // each element
  135.   
  136. // initialize groups...
  137.  for(n in $.rating.groups)//{ not needed, save a byte!
  138. (function(c, v, n){ if(!c) return;
  139. $.rating.event.fill(n, c, 'on');
  140. $(v).val($(c).children('a').text());
  141. })
  142. ($.rating.groups[n].current, $.rating.groups[n].valueElem, n);
  143. //}; not needed, save a byte!
  144. return this; // don't break the chain...
  145. };
  146. /*# AVOID COLLISIONS #*/
  147. })(jQuery);
  148. /*# AVOID COLLISIONS #*/