2009-08-17 4 views
1

Спасибо вам все впереди. Это первый раз, когда я разрабатываю плагин jQuery (и в первую очередь разрабатываю в javascript, а также на самом деле), и я должен сказать, что я довольно geeked (Вероятно, у вас много отвратительных вещей для опытных разработчиков js/jquery, но это мой первая попытка - пожалуйста, медведь со мной :). Я приветствую конструктивную критику любого из кодов.Разработка плагина jQuery - передача параметров пользовательской функции обратного вызова

Это плагин с модельным ящиком (да, есть другие, но требования к работе диктуют, что я кодирую свои собственные, чтобы избежать зависимостей сторонних разработчиков), которые отображают текст, текст из вызова ajax или форму, указанную/взятую от вызова ajax, а затем обрабатывает подачу формы через ajax. Это должно быть как можно более настраиваемым, поэтому я могу обеспечить некоторые крючки (? - анонимные функции), которые пользователь может использовать для передачи пользовательского кода в плагин.

Проблема, с которой я сталкиваюсь, - это предоставление параметров функции пользователя. Если я использую ключевое слово 'this', я могу передать переменную msg, и пользовательская функция может ее использовать. Но когда я передаю «msg» вместо «this», пользователь получает пустую переменную. Я хотел бы передать больше, чем просто msg - также массив данных, переданных в вызове ajax, и объект jQuery в поле модели - это то, что я действительно хотел бы сделать.

Ниже приведен фрагмент - функция находится внутри и вызывается внутри плагина; Я просто сгруппировал код в функции для целей организации/разработки.

// Submits the form inside of the model box 
    // and calls the user hooks of onFormSuccess and 
    // onFormFailure for ajax success and error 
    function submitForm() { 
     var URL = $('form',$contentNode).attr('action'), 
     method = $('form',$contentNode).attr('method'), 
     data = $('form',$contentNode).formSerialize(); 

     $.ajax({ 
      url: URL, 
      type: method, 
      data: data, 
      success: function(msg) { 
       // Doesn't work, but I would like it too 
       //settings.onFormSuccess.call(msg, breakData(data)); 
       // Does work 
       settings.onFormSuccess.call(this); 
      }, 
      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       setings.onFormFailure.call(errorThrown); 
      } 
     }); 
     closeModel(); 
    } 
+0

tl dr; не могли бы вы привести более короткий пример? – Greg

+0

только, извините, что –

ответ

5

См. call syntax. Первый параметр определяет, что this будет внутри самой функции обратного вызова. В качестве параметра функции обратного вызова передается значение не.

Для передачи параметров обратного вызова вы использовать оставшиеся параметры call:

settings.onFormSuccess.call(thisArg, msg, dataArray); 

Обратный вызов будет получать два параметра, и работать с this указывая на thisArg:

function successHandler(msg, dataArray) {} 

Еще один вопрос с вашим кодом является значение this внутри ваш успешный обработчик не имеет смысла. Из чего он выглядит, он просто укажет на объект window. Таким образом, вызываемые вызовы также будут работать с this == window.