2012-01-11 4 views
3

вот мой код пользовательского JQuery плагин:Почему функция плагина jquery всегда возвращает объект вместо строки?

(function($){ 
    $.fn.extend({ 
     getmyValue : function(){ 
     return this.each(function() { 
       return this.myVal; 
     }); 
     }, 
     initPlugin : function(){ 
     return this.each(function() { 
       this.myVal='Some results'; 
     }); 
     } 
    }); 
})(jQuery); 

, когда я запускаю этот код:

$(document).ready(function() { 

$("#div").initPlugin(); 
alert($("#div").getmyValue()); 
}); 

возвращаемое значение не является обычной строкой, как предполагалось, но объект ($ ("# div "))

что я не могу понять, почему цепочка возврата не работает?

+1

Вы возвращая результат 'this.each', который не является строкой. Почему бы вам просто не вернуть 'this.myVal'? Непонятно, что вы пытаетесь выполнить. –

ответ

4

Поскольку возвращаемое значение each является объектом, на который вы звоните, each. Возвращаемое значение функции eachзвонки используется для определения того, прекратить ли цикл (то есть, функция итерации может возвращать false, чтобы остановить цикл   — docs link).

Непонятно из вашего кода, что вы действительно хотите сделать в getmyValue; вернуть значение, которое вы сохранили в самом экземпляре jQuery? Верните myVal, сохраненный в первом содержащем элементе? Возвращает массив значений myVal из всех содержащихся элементов?

Если вы означали myVal сохраненные на экземпляре JQuery вашего плагин:

getmyValue : function(){ 
    // Here, `this` is the jQuery instance on which `getmyvalue` was called 
    return this.myVal; 
}, 

Если вы означали myVal на первый элементе (обратите внимание, что это сырье DOM элемент в типичном случае):

getmyValue : function(){ 
    // Here, `this` is the jQuery instance on which `getmyvalue` was called. 
    // `this[0]` is the first matched element (a raw DOM element, typically). 
    // Note we check before accessing it to see if it's there, since a jQuery 
    // instance may have matched zero elements. 
    return this[0] ? this[0].myVal : undefined; 
}, 

Если вы имели в виду массив myVal значений всех соответствующих элементов (опять-таки, они будут сырые элементы DOM в типичном случае):

getmyValue : function(){ 
    // Here, `this` is the jQuery instance on which `getmyvalue` was called. 
    return this.map(function() { 
      // Here, though, `this` one of the elements wrapped by the jQuery, 
      // instance typically a raw DOM element. (Each of them in a loop.) 
      return this.myVal; 
    }).get(); 
}, 

... который использует map для получения массива значений, зависящих от jQuery, а затем get, чтобы получить из него необработанный массив.

+0

Спасибо, что я искал :) – mrbm

0

Возврат .each является объектом. Если вы замените это на .map, тогда ваш код вернет список значений, разделенных запятыми.

jQuery Map

+0

* «Если вы замените это на .map, тогда ваш код вернет список значений с разделителями-запятыми». * Нет, он вернет экземпляр jQuery, обертывающий значения. В соответствии с теми документами, которые вы связали. –

+0

Мне не хватало '.get(). Join (',');'. Это приведет к возврату значений и их правильному форматированию. – kwelch

1

Вы возвращая результат this.each(), а не this.myVal:

getmyValue: function() { 
    return this.myVal; 
} 
Смежные вопросы