#jquery #plugins #jquery-plugins #scope
#jquery #Плагины #jquery-плагины #область действия
Вопрос:
Я пытаюсь создать плагин jquery (просто для развлечения), и, похоже, у меня не получается в определенной части делать то, что я хочу.
(function($){
var resetText = function(){ if (this.value == "") this.value = this.title; }
var clearText = function(){ if (this.value == this.title) this.value = ""; }
$.fn.placeHolder = function() {
return this.each(function(){
resetText(); // <-- this doesn't work
$(this).focus(clearText).blur(resetText);
});
};
})(jQuery);
В принципе, я хочу, чтобы атрибут title был скопирован в атрибут value (если значение пустое) в doc.ready И в field.blur
Как и сейчас, это работает на blur, но не на document.ready
У меня такое чувство, что это проблема с областью действия, но, честно говоря, я не знаю, как это исправить.
Убедитесь сами: http://jsfiddle.net/Usk8h /
Ответ №1:
У вас this
проблема, а не проблема с областью действия.
Сделайте это вместо:
resetText.call( this );
.call()
Метод позволяет вам установить значение this
в resetText()
функции на то, что вы передаете в качестве первого аргумента.
В этом случае вы передаете элемент DOM, представленный this
в .each()
.
Редактировать:
На самом деле вы могли бы сократить свой плагин до этого:
$.fn.placeHolder = function() {
return this.focus(clearText).blur(resetText).blur(); // <-- triggers blur
};
Комментарии:
1. @Johnny Мне это показалось интересным, поэтому я немного почитал об этом, интересное объяснение здесь: devlicio.us/blogs/sergio_pereira/archive/2009/02/09 /…
2. @kingjiv — Я сделал то же самое и нашел похожую статью. Спасибо за это! В итоге я выбрал второй вариант, который просто запускает событие onBlur, но я все равно рад узнать, что вы можете переопределить это . 🙂
Ответ №2:
Похоже, это проблема с областью действия. Как насчет этого?
(function($){
var resetText = function(myThis){ if (myThis.value == "") myThis.value = myThis.title; }
var clearText = function(myThis){ if (myThis.value == myThis.title) myThis.value = ""; }
$.fn.placeHolder = function() {
return this.each(function(){
resetText(this);
$(this)
.focus(function(){
clearText(this);
}).blur(function(){
resetText(this);
});
});
};
})(jQuery);
Комментарии:
1. Спасибо за ваши усилия! В конечном счете, мне больше понравилось другое предложенное решение. Я просто казался более чистым и удобным в обслуживании. Однако ваше решение сработало , так что спасибо за ваше время.