Плагин jQuery - передача и выполнение произвольной функции - PullRequest
1 голос
/ 21 февраля 2011

Я довольно новичок в JQ, поэтому любая помощь по этому поводу оценена, несколько оставшихся черепных фолликулов получают травмы ...

У меня есть простой плагин jQuery, который использует Ajax для заполнения #selector (UL)Результаты (в виде серии) с использованием AppendTo.Это междоменный вызов, поэтому, насколько я могу судить, поддерживается только asych: true.

Плагин работает, но мне нужно разрешить пользователю поражать добавленные элементы DOM произвольными функциями (т.е.функции, определенные пользователем плагина, такие как $ (". foo"). draggable () или что-то еще), и выполнение этого вне плагина не работает, потому что мы междоменные и асинхронные.

Я думаю, что янужно передать произвольную функцию плагину во время выполнения, но это далеко, как я могу получить.Я возился с делегатом () / trigger () и bind (namespcae.bar), но пока не добился успеха ...

Как это должно быть обработано?

Вызов выглядит такэто:

        $(document).ready(
        function () {
            $('#targetDiv').myPlugin({ count: 10});
            //$(".foo").draggable(); // does not work, because we are async.
        });

Плагин выглядит так:

    (function ($) {
    $.fn.myPlugin = function (options) {  
    $.ajaxSetup({ cache: true, async: false }); // false doesn't work - cross domain  
    var defaults = {count: 5};  
    var options = $.extend(defaults, options);  
    return this.each(function () {  
    var obj = $(this);  
    $.ajax({  
        type: 'GET',  
        async: false,  
        dataType: 'json',  
        data: {},  
        url: 'http://someurl.com?callback=?&otherstuff=somedata',  
        success: function (data) {  
            $.each(data.results, function (i, item){  
               t = $(<LI class='foo'> + item.text </LI>').appendTo(obj);  
               // this works but may need any arbitrary jQuery.ui function  
               //t = $(item.text).appendTo(obj).draggable();  
               // maybe this but not sure how it should be done  
               //$(t).trigger(ArbitraryEventHandler); ???  

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

Передайте обратный вызов вашему плагину.Что-то вроде:

$('#targetDiv').myPlugin({ count: 10, callback: function(element){
    element.draggable(); // Or whatever you want to do with your item
}});

Затем вызовите этот обратный вызов в случае успеха Ajax, например:

    success: function (data) {  
        $.each(data.results, function (i, item){  
           t = $(<LI class='foo'> + item.text </LI>').appendTo(obj);  
           options.callback(t); 
0 голосов
/ 21 февраля 2011

Спасибо за ответы, я хочу в какой-то момент взглянуть на 1,5, и я определенно посмотрю, работает ли это (звучит правильно) ... Я придумал следующее, пока кто-то другой публиковал по существу то же самое решение, нонемного чище ... проблема решена благодаря всем

Сначала создайте произвольную функцию, подобную этой, вне блока DocumentReady:

function myArbitraryFunction(t) { // do some work...}

Затем добавьте параметр в параметры плагина:

var defaults =  {
    count: 5,
    itemFunction:null};

и затем при вызове плагина этот бит волшебства заканчивает тем, что передает указатель на ArbitraryFunction в качестве значения опции

$("#targetDiv").myPlugin( { count: 10, itemFunction: function () { my ArbitraryFunction(t) }});

и, наконец, в блоке кода успеха ajax:

success: function (data) {
    $.each(data.results, function(i, item){
        t = $(<LI class='foo'> + item.text </LI>').appendTo(obj);
        // here is the magic !!
        if(option.itemFunction != null){
             options.itemFunction(t)
        }
....

много кусочков, чтобы соединиться, но пока это работает ....

0 голосов
/ 21 февраля 2011

это выглядит как хороший случай для использования нового отложенного объекта в jQuery 1.5 (который $.ajax() можно использовать за кулисами. По сути, он позволяет ставить в очередь обратные вызовы выполняется, когда ваш вызов ajax успешно завершается (или вызывается при возникновении ошибки).

...