Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.02.2020, 22:52
Новичок на форуме
Отправить личное сообщение для PraVitelb Посмотреть профиль Найти все сообщения от PraVitelb
 
Регистрация: 06.02.2020
Сообщений: 6

Рейтинг starrr (Разовое использование)
Здравствуйте, подскажите пожалуйста как можно сделать разовую активацию рейтинга? Один раз нажал и рейтинг был заблокирован, пока не перезагрузишь страницу.

https://github.com/dobtco/starrr

https://jsfiddle.net/PraVitelb/6x49hc18/11/
<div class="starrr" data-rating="'7.5'" id="1"></div>
<div class="starrr" data-rating="'3.4'" id="2"></div>

var slice = [].slice;
(function($, window) {
	var Starrr;
	var active;
	window.Starrr = Starrr = (function() {
		Starrr.prototype.defaults = {
			rating: void 0,
			max: 10.0,
			readOnly: false,
			emptyClass: 'far fa-star',
			fullClass: 'fas fa-star',
			halfClass: 'fas fa-star-half-alt',
			change: function(e, value) {}
		};
	
		function Starrr($el, options) {
			this.options = $.extend({}, this.defaults, options);
			this.$el = $el;
			this.createStars();
			this.syncRating();
			if (this.options.readOnly) {
				$(this)[0].$el.children().addClass('readonly')
				return;
			}
			this.$el.on('mouseover.starrr', 'a', (function(_this) {
				return function(e) {
					return _this.syncRating(_this.getStars().index(e.currentTarget) + 1.0);
				};
			})(this));
			this.$el.on('mouseout.starrr', (function(_this) {
				return function() {
					return _this.syncRating();
				};
			})(this));
			this.$el.on('click.starrr', 'a', (function(_this) {
				return function(e) {
					e.preventDefault();
					return _this.setRating(_this.getStars().index(e.currentTarget) + 1.0);
				};
			})(this));
			this.$el.on('starrr:change', this.options.change);
		}
		Starrr.prototype.getStars = function() {
			return this.$el.find('a');
		};
		Starrr.prototype.createStars = function() {
			var j, ref, results;
			results = [];
			for (j = 0.5, ref = this.options.max; 0.5 <= ref ? j <= ref : j >= ref; 0.5 <= ref ? j++ : j--) {
				results.push(this.$el.append("<a href='#rating' />"));
			}
			return results;
		};
		Starrr.prototype.setRating = function(rating) {
			/*if (this.options.rating === rating) {
				rating = void 0;
			}*/
			this.options.rating = rating;
			this.syncRating();
			return this.$el.trigger('starrr:change', rating);
		};
		Starrr.prototype.getRating = function() {
			return this.options.rating;
		};
		Starrr.prototype.syncRating = function(rating) {
			var $stars, i, j, ref, results;
			rating || (rating = this.options.rating);
			$stars = this.getStars();
			results = [];
			for (i = j = 0.5, ref = this.options.max; 0.5 <= ref ? j <= ref : j >= ref; i = 0.5 <= ref ? ++j : --j) {
				results.push($stars.eq(i - 0.5).removeClass(rating >= i ? (rating >= (i+0.5) ? this.options.halfClass : this.options.fullClass) : (rating < (i+0.5) ? this.options.halfClass : this.options.halfClass)).addClass(rating >= i ? (rating >= (i+0.5) ? this.options.fullClass : this.options.halfClass) : (rating < (i+0.5) ? this.options.emptyClass : this.options.fullClass)));
			}
			return results;
		};
		return Starrr;
	})();
	return $.fn.extend({
		starrr: function() {
			var args, option;
			option = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
			return this.each(function() {
				var data;
				option.rating = $(this).attr("data-rating");
				data = $(this).data('starrr');
				if (!data) {
					$(this).data('starrr', (data = new Starrr($(this), option)));
				}
				if (typeof option === 'string') {
					return data[option].apply(data, args);
				}
			});
		}
	});
})(window.jQuery, window);
Ответить с цитированием
  #2 (permalink)  
Старый 06.02.2020, 23:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Сообщение от PraVitelb
разовую активацию рейтинга?
строка 35
this.$el.one('click.starrr', 'a', (function(_this) {
Ответить с цитированием
  #3 (permalink)  
Старый 07.02.2020, 02:16
Новичок на форуме
Отправить личное сообщение для PraVitelb Посмотреть профиль Найти все сообщения от PraVitelb
 
Регистрация: 06.02.2020
Сообщений: 6

Сообщение от рони Посмотреть сообщение
строка 35
this.$el.one('click.starrr', 'a', (function(_this) {

Спасибо Вам большое

А не подскажете ещё как можно заблокировать использование по id

<div class="starrr" data-rating="'7.5'" id="1"></div>
<div class="starrr" data-rating="'3.4'" id="2"></div>
<div class="starrr" data-rating="'7.5'" id="3"></div>

Допустим id="3" чтобы нажать нельзя было
Там есть функция - readOnly: true, но как бы я не пробовал, либо не блокирует, либо всё не работает
Ответить с цитированием
  #4 (permalink)  
Старый 07.02.2020, 10:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

PraVitelb,
после строки 18 добавить код
this.options.readOnly =  this.$el.data('readonly');


а в элемент атрибут
<div class="starrr" data-rating="7.1" id="2" data-readonly="true" ></div>
Ответить с цитированием
  #5 (permalink)  
Старый 07.02.2020, 12:25
Новичок на форуме
Отправить личное сообщение для PraVitelb Посмотреть профиль Найти все сообщения от PraVitelb
 
Регистрация: 06.02.2020
Сообщений: 6

рони,

Сообщение от рони Посмотреть сообщение
PraVitelb,
после строки 18 добавить код
this.options.readOnly =  this.$el.data('readonly');


а в элемент атрибут
<div class="starrr" data-rating="7.1" id="2" data-readonly="true" ></div>
А через JS это можно сделать? То есть при нажатии чтобы присваивался атрибут
Пытаюсь добавить никак не получается
Ответить с цитированием
  #6 (permalink)  
Старый 07.02.2020, 12:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

PraVitelb,
не понимаю
Ответить с цитированием
  #7 (permalink)  
Старый 07.02.2020, 12:49
Новичок на форуме
Отправить личное сообщение для PraVitelb Посмотреть профиль Найти все сообщения от PraVitelb
 
Регистрация: 06.02.2020
Сообщений: 6

рони,
Атрибут: data-readonly отключает использование рейтинга
Мне нужно чтобы при нажатии на звезду применялся этот атрибут и рейтинг не работал
Но как я не пытаюсь его добавить ничего не выходит
Ответить с цитированием
  #8 (permalink)  
Старый 07.02.2020, 13:12
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Сообщение от PraVitelb
рейтинг не работал
чем one не устроил?
Ответить с цитированием
  #9 (permalink)  
Старый 07.02.2020, 13:16
Новичок на форуме
Отправить личное сообщение для PraVitelb Посмотреть профиль Найти все сообщения от PraVitelb
 
Регистрация: 06.02.2020
Сообщений: 6

Устроил, но если наводить мышкой то анимация работала

В общем в конце концов получилось сделать то, что хотел, спасибо тебе большое рони за помощь)
Ответить с цитированием
  #10 (permalink)  
Старый 07.02.2020, 13:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

PraVitelb,
вместо one

добавить
_this.$el.off();
в строку 37
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript. Уровень 3в. Серверное программирование на Node.js maxy666 Node.JS 8 10.08.2014 00:36
Рейтинг материала also Элементы интерфейса 3 03.03.2013 17:33
jquery.rating Рейтинг к каждой фотографии Makkssimka jQuery 14 18.02.2013 21:38
Звездный рейтинг на js nata031189 jQuery 3 22.04.2012 21:50