Возможная проблема с областью действия плагина jQuery?

#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:

Похоже, это проблема с областью действия. Как насчет этого?

http://jsfiddle.net/Usk8h/1/

 (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. Спасибо за ваши усилия! В конечном счете, мне больше понравилось другое предложенное решение. Я просто казался более чистым и удобным в обслуживании. Однако ваше решение сработало , так что спасибо за ваше время.