Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.03.2013, 01:13
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

Создание плагина для jQuery 1.9.1
Привет, JavaScript'еры

У меня возникла проблема с созданием плагина для jQuery 1.9.1.
Подключаю jQuery, ниже пишу:

(function( $ ) { 

    $.fn.userSelect = function(value) {
      alert(this.innerHTML);  // undefined
      this.style.webkitUserSelect = value;
      this.style.mozUserSelect = value;
      this.style.oUserSelect = value;
      this.style.msUserSelect = value;
      this.style.userSelect = value;
    };
  })(jQuery);


В консоли хрома пишет: "Uncaught TypeError: Cannot set property 'webkitUserSelect' of undefined ".

Вызываю метод так:

$(document).ready(function() {
$('#my_select').userSelect();
});

Элемент с id my_select существует.

Подскажите, почему в this не заносится объект элемента?
Ответить с цитированием
  #2 (permalink)  
Старый 07.03.2013, 01:28
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

(Sandr),
стилевый свойства вроде jQuery сам перетранслирует для текущего бразера
Или у Вас специфические ?
К примеру тоже opaсity=0.7

Последний раз редактировалось Deff, 07.03.2013 в 01:32.
Ответить с цитированием
  #3 (permalink)  
Старый 07.03.2013, 01:50
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

Deff,
проблема не в задании свойств элементу, а в том, что this ни на что не ссылается.
alert(this.innerHTML) выдаёт undefined. Хотя, как я уже написал выше, элемент #my_select существует.

Даже если пробовать использовать не специфические свойства:
this.style.color = 'white';

То выдаёт, в общем-то, тоже самое: "Uncaught TypeError: Cannot set property 'color' of undefined".
Ответить с цитированием
  #4 (permalink)  
Старый 07.03.2013, 04:22
Интересующийся
Отправить личное сообщение для imsha Посмотреть профиль Найти все сообщения от imsha
 
Регистрация: 19.11.2008
Сообщений: 28

$('element') - может быть выбран не один элемент, поэтому нужно использовать к примеру each

(function( $ ) { 
	$.fn.userSelect = function(value) {
		this.each(function(){
		  alert(this.innerHTML);  // undefined
		  this.style.webkitUserSelect = value;
		  this.style.mozUserSelect = value;
		  this.style.oUserSelect = value;
		  this.style.msUserSelect = value;
		  this.style.userSelect = value;
		});
	};
})(jQuery);


вот рабочий пример http://jsfiddle.net/eZDAY/
Ответить с цитированием
  #5 (permalink)  
Старый 07.03.2013, 04:48
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

1) Это лучше не плагином оформить, а хуком на установку стилей (если jQuery позволяет это делать, думаю да)
2) Нужно выставлять нужное свойство для текущего браузера, а не все подряд. Подойдет проверка this.style[prop] !== undefined
3) oUserSelect - такого свойства нет, и врядли будет, с учетом будущего перехода Оперы на вебкит. http://caniuse.com/#feat=user-select-none
Ответить с цитированием
  #6 (permalink)  
Старый 07.03.2013, 16:37
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

imsha,
спасибо, работает)
Ответить с цитированием
  #7 (permalink)  
Старый 07.03.2013, 16:45
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

danik.js,

1) Что такое "хук"?
2) Ок.
3) Хмм.. Как же тогда в опере запретить выделения текста?



Я хочу сделать своеобразную библиотеку, основанную на jQuery. Не подскажите, как лучше всего это оформить?
В виде отдельных плагинов? Или как-то всё это в один собрать?
Ответить с цитированием
  #8 (permalink)  
Старый 07.03.2013, 17:56
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

<script src="//code.jquery.com/jquery-latest.js"></script>
<script>
var userSelectProp = (function(name, style){
    var cssPrefixes = [ "webkit", "o", "moz", "ms" ];
	if ( name in style ) {
		return name;
	}

	var capName = name.charAt(0).toUpperCase() + name.slice(1),
		origName = name,
		i = cssPrefixes.length;

	while ( i-- ) {
		name = cssPrefixes[ i ] + capName;
		if ( name in style ) {
			return name;
		}
	}

	return origName;
})('userSelect', document.createElement('div').style);


jQuery.cssHooks.userSelect = {
    get: function( elem, computed ) {
	    // не умею
	},

	set: function( elem, value ) {
        elem.style[userSelectProp] = value;
    }
};
</script>
<div>Тестовый текст. Пробуй выделить</div>
<button onclick="$('div').css('user-select', 'none')">Сделать невыделяемым</button>


Опера не поддерживает это свойство. Вариант с event.preventDefault по onmousedown не подходит?
Ответить с цитированием
  #9 (permalink)  
Старый 08.03.2013, 19:18
Профессор
Отправить личное сообщение для (Sandr) Посмотреть профиль Найти все сообщения от (Sandr)
 
Регистрация: 14.10.2010
Сообщений: 376

danik.js,
спасибо за пример. Насчёт event.preventDefault как-то не подумал, попробую.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery для загрузки страницы в <div> Dr.Holerik jQuery 12 11.10.2016 17:36
Подскажите unwrap для версии jquery 1.3.2 Randomizer jQuery 4 07.10.2012 17:47
Внешняя ссылка на страницу которая находится в IFRAME Модального окна плагина jQuery Андррр jQuery 0 07.12.2011 15:13
Скрипт для плагина к Download Master ponand Общие вопросы Javascript 21 05.01.2009 22:12
Написание плагина для Firefox SunnyDay Общие вопросы Javascript 2 02.12.2008 15:21