2013-10-04 5 views
1

Если я определяю прототип как этотОбъект как прототип jQuery.fn?

jQuery.fn.myFunc = function() { 
    console.log(this); 
} 

и назвать его так:

$('div').myFunc(); 

this внутри myFunc будет относиться к выбору объекта JQuery.

Теперь, если я не хочу загрязнять .fn с несколькими присоединенными функциями, я могу сделать что-то вроде

jQuery.fn.myPlugin = { 

    myFunc1: function() { 

    }, 

    myFunc2: function() { 

    }  

} 

Если я называю это $('div').myPlugin.myFunc1(); - как получить ссылку на выбранные объекты внутри myFunc1? Или есть другой, лучший подход?

+1

возможно дубликат (http://stackoverflow.com/questions/10638948/very-simple-jquery-plugin-tutorial) – falinsky

ответ

1

Nope. не может этого сделать. Вместо этого определите его как функцию, затем добавьте свойства к этой функции.

jQuery.fn.myPlugin = function() { 
    console.log(this); 
}; 

jQuery.fn.myPlugin.myFunc1 = function() { 

}; 

jQuery.fn.myPlugin.myFunc2 = function() { 

}; 

отмечает, что myFunc1 и myFunc2 до сих пор не будут»имеют доступ к выбранному элементу, поэтому это относительно бесполезно определять их таким образом, кроме того, что они могут быть легко переопределены другими разработчиками (это хорошая вещь)

Обычный способ использования дополнительных методов в вашем плагине - заставить ваш метод плагина принять параметр, который может быть объектом для инициализации плагина, или строка для выполнения целевого метода для элемента. например, $("somediv").myPlugin("myFunc1")

+0

Итак, если я правильно понял, только функция «root», назначенная непосредственно на .fn.name', будет иметь доступ к выбранным элементам. Невозможно определить несколько функций под общим «пространством имен», я думаю, что это будет иметь такую ​​способность? –

+0

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

+0

Красивые. Мне понравился '$ (« somediv »). MyPlugin (« myFunc1 »). –

0

Работайте, если вы создали объект раньше.

Как это:

<script> 
    jQuery.fn.myPlugin = {}; 

    jQuery.fn.myPlugin = { 

     myFunc1: function() { 
      console.log(this); 
     }, 

     myFunc2: function() { 
      alert(this); 
     }  

    }; 
    $(document).ready(function(){ 
     $('div').myPlugin.myFunc1(); 
     $('div').myPlugin.myFunc2(); 
    }); 

</script> 
+0

Нет, 'this'still возвращает сам объект myPlugin' –

0

jQuery plugin tutorial предлагает следующее:

(function($) { 

    $.fn.popup = function(action) { 

     if (action === "open") { 
      // Open popup code. 
     } 

     if (action === "close") { 
      // Close popup code. 
     } 

    }; 

}(jQuery)); 

Я полагаю, что это будет еще одна альтернатива:

(function($) { 
    $.fn.myPlugin = function (action) { 
     var functions = { 
      open: function() { 
       console.log('open: ', this); 
      }, 
      close: function() { 
       console.log('close:', this); 
      } 
     } 

     if (action && functions[action]) { 
      functions[action].call(this) 
     } else { 
      console.log('no function', this); 
     } 

     return this; 
    }; 
}(jQuery)); 

$('#theDiv') 
    .myPlugin() 
    .myPlugin('open') 
    .myPlugin('close'); 

http://jsfiddle.net/faJAk/

0

Другой возможный подход заключается в использовании defineProperty:

(function($) { 

    var myPlugin = { 
     foo: function() { 
      console.log(this) 
     } 
    } 

    Object.defineProperty($.fn, "myPlugin", { 
     get : function() { return $.extend({}, this, myPlugin) } 
    }); 

})(jQuery); 

$(...).myPlugin.foo Теперь необходимо правильно решить this: [? Очень простой Jquery Plugin Tutorial]

$(function() { 
    $("body").myPlugin.foo(); // logs "body" 
}) 
+0

Нужно ли его вызывать внутри' $ (function() {}) '? –

+0

@YuriyGalanter: если вы имеете в виду '(function ($) ..) (jQuery)' - no, но это считается хорошей практикой и полезно, когда ваш плагин имеет свои собственные локальные переменные и функции. – georg

Смежные вопросы