2009-12-06 9 views
-2

я написал немного Jquery кнопку плагин - он содержит метод нанесения OnClick-функции - вот кодИспользование функций из внутри плагина

(function ($) { 
    $.fn.tButton = function() 
    { 
    this.setFN = function(fn) 
    { 
     alert("function set."); 
    } 
    }; 

})(jQuery); 

Я использую этот код, чтобы инициализировать его (на дел):

var button = $("#myButton").tButton();

теперь проблема: при попытке применить функцию setFN:

button.setFN(function(){dosomething();}); 

Я получаю ошибку: button.setFN is not a function

Я уже попробовал this.bind вместо этого, но не помог. Кто-нибудь знает, что случилось?

ответ

0

Функция tButton. Если следует читать так:

var button = $("#myButton").tButton(function(){dosomething();}); 
+0

, где находится setFN? ..:/ – Fuxi

2

Вы ничего из функции TButton не возвращаются поэтому значение TButton не то, что вы думаете. Попробуйте вернуть из tButton(), чтобы вернуть объект jQuery. Кроме того, я не думаю, что это хороший способ сделать это, поскольку вы в основном расширяете jQuery нестандартным образом. Лучшим способом было бы заставить tButton использовать функцию обратного вызова в качестве аргумента и применять ее только к соответствующим элементам. Я бы также использовал другой шаблон для определения плагина (аналогично плагинам пользовательского интерфейса).

(function ($) { 
    $.fn.extend({ 
     tButton: function(callback) { 
      return this.each(function() { 
      new $.TButton(this,callback); 
      }); 
     } 
    }); 

    $.TButton = function(elem,callback) { 
     $(elem).click(callback); 
    }; 
})(jQuery); 
+0

Я попытался добавить это значение в конце функции tButton - ту же ошибку. Я думаю, что вы правы относительно стандартов jquery, но мне нужно уметь назначать/изменять функцию кнопки после этого. – Fuxi

+0

Затем функция принимает несколько аргументов и делает разные вещи на основе этих аргументов. Если, например, список аргументов представляет собой строку «click» и функцию, повторно применяйте функцию щелчка к элементу, в противном случае делайте обычную вещь. – tvanfosson

+0

спасибо за ваш пример - выглядит просто и просто :) есть только одна проблема - он не отлаживается в firebug .. dunno, если это моя система. – Fuxi

0

Вот шаблон, который вы можете использовать это сделать:

$.TButton = function(el){ 
    var $el = $(el); 
    $el.data('TButton', this); // Store a reference to the TButton object on the DOM element 
    // Use this.functionName to make it "public" 
    this.setFN = function(callback){ 
     // Namespace the click events so you don't accidently remove 
     // other click events bound to the button. 
     $el.unbind('click.tbutton').bind('click.tbutton', callback); 
    } 
} 

$.fn.tButton = function(func){ 
    return this.each(function(){ // Don't break the chain 
     if(! func){ // If no parameter is passed, this is a constructor 
     (new $.TButton(this)); 
     } else { // If the parameter (expected to be a function), call setFN 
     var button = $(this).data('TButton'); 
     if(button) button.setFN(func); 
     } 
    });   
} 

Теперь вы можете инициализировать с помощью этого:

$("button").tButton(); 

И можно назвать setFN два пути, как это:

$("button").tButton(function(){ ... }); 
// or 
$("button").data('TButton').setFN(function(){ ... }); 
Смежные вопросы