Пользовательская функция JQuery не возвращается, как ожидалось - PullRequest
0 голосов
/ 08 декабря 2011

Я пытаюсь создать jQuery-версию функции wordwrap в php - я задал более ранний вопрос об этом и был направлен на эту функцию javascript, которая делает именно то, что я ищу, за исключением того, чтоЯ не могу заставить его дружить с jQuery - в основном я думаю по незнанию.

Я решил попробовать адаптировать код, который мне предоставили, в плагин jQuery - для развлечения и потому, что могуне могу найти что-то, чтобы делать то, что я хочу, и потому что я подумал, что это будет хороший опыт обучения, но я не могу заставить его работать -

вот оригинальный javascript:

function wordwrap( str, width, brk, cut ) {

    brk = brk || '\n';
    width = width || 75;
    cut = cut || false;

    if (!str) { return str; }

    var regex = '.{1,' +width+ '}(\\s|$)' + (cut ? '|.{' +width+ '}|.+$' : '|\\S+?(\\s|$)');

    return str.match( RegExp(regex, 'g') ).join( brk );

}

А потом мой jQuery - который, я думаю, вероятно, неверен:

  $.fn.wordwrap = function(options) {
    var settings = $.extend({
      'brk': '<br>',
      'width': '5',
      'cut': 'false'
    }, options);

    var regex = '.{1,' +settings.width+ '}(\\s|$)' + (settings.cut ? '|.{' +settings.width+ '}|.+$' : '|\\S+?(\\s|$)');

    return this.html(function(i, html) {
      return text.html(RegExp(regex, 'g')).join(settings.brk);
    });

У меня ограниченный опыт создания плагинов.Я прочитал руководство по jQuery на http://docs.jquery.com/Plugins/Authoring и чувствую, что все делаю правильно, но ничего не происходит при вызове элемента, например:

$('#foo').wordwrap({'width' : '25'});

Я не получаю никаких ошибок в Chrome Web Inspect, но на моей странице тоже ничего не происходит ...

Я считаю, что проблема заключается в возвращаемой строке в конце функции - я предполагаючто я не делаю что-то должным образом, чтобы получить желаемый результат

Любая помощь с благодарностью!

ОБНОВЛЕНИЕ: ПОЛУЧИЛ СПАСИБО!Вот последний сценарий, который я использую:

  $.fn.wordwrap = function(options) {
    var settings = $.extend({
      'brk': '<br>',
      'width': '75',
      'cut': 'false'
    }, options);

    var regex = '.{1,' +settings.width+ '}(\\s|$)' + (settings.cut ? '|.{' +settings.width+ '}|.+$' : '|\\S+?(\\s|$)');

    return this.html(function(i, html) {
      var match = html.match(RegExp(regex, 'g'));
      if (match != null) {
        return match.join(settings.brk); 
      }
    });

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Вы не возвращаете текст из плагина jQuery, вы возвращаете коллекцию, над которой работаете.Это делает работу цепочки.

Я думаю, это то, что вы хотите ...

$.fn.wordwrap = function(options) {
    var settings = $.extend({
        'brk': '<br>',
        'width': '75',
        'cut': 'false'
    }, options);

    var regex = '.{1,' + settings.width + '}(\\s|$)' + (settings.cut ? '|.{' + settings.width + '}|.+$' : '|\\S+?(\\s|$)');


    return this.text(function(i, text) {
              return text.match(RegExp(regex, 'g')).join(settings.brk);
           });

};

Вам также следует изменить параметр cut по умолчанию на false.Заворачивание в строку просто усложняет ситуацию.Опция width также должна быть просто Number.

0 голосов
/ 08 декабря 2011

Я потратил время, чтобы превратить его в плагин на основе jQuery документации .Вы можете получить его из этого jsfiddle , где вы также можете протестировать его.Я также разместил его ниже, чтобы вы могли проверить его, не заходя на jsfiddle.net.Он поддерживает связывание и проверяет, чтобы объект, к которому он применяется, имел текстовое свойство, прежде чем попытаться обернуть.

(function ($) {
    var settings = {
        brk: '<br />',
        width: '75',
        cut: 'false'
    }, methods = {
        init : function( options ) {     
            var regex,
                t = $(this),
                txt = t.text();

            settings = $.extend(settings, options);

            regex = '.{1,' + settings.width + '}(\\s|$)' + (settings.cut ? 
                            '|.{' + settings.width + '}|.+$' : 
                            '|\\S+?(\\s|$)')

            if (txt && txt !== '') {            
                t.html(txt.match(RegExp(regex, 'g')).join(settings.brk));
            }

            return t;
        }
    };

    $.fn.wordwrap = function( method ) {  
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.wordwrap.' );
        }      
    };
}(jQuery));
...