jQuery插件-传递和执行任意函数

jQuery插件-传递和执行任意函数,jquery,ajax,function,plugins,asynchronous,Jquery,Ajax,Function,Plugins,Asynchronous,我是JQ的新手,所以在这方面的任何帮助都是值得赞赏的,几乎没有剩余的颅骨毛囊受到创伤 我有一个简单的jQuery插件,它使用Ajax使用AppendTo将结果(作为一系列结果)填充到#选择器(UL)中。这是一个跨域调用,所以,据我所知,只支持asych:true 该插件可以工作,但我需要允许用户使用任意函数(即由插件用户确定的函数,如$(“.foo”).draggable()或其他任何函数)点击附加的DOM项,并且在插件之外执行该操作不起作用,因为我们是跨域和异步的 我想我需要在运行时将任意函数

我是JQ的新手,所以在这方面的任何帮助都是值得赞赏的,几乎没有剩余的颅骨毛囊受到创伤

我有一个简单的jQuery插件,它使用Ajax使用AppendTo将结果(作为一系列结果)填充到#选择器(UL)中。这是一个跨域调用,所以,据我所知,只支持asych:true

该插件可以工作,但我需要允许用户使用任意函数(即由插件用户确定的函数,如$(“.foo”).draggable()或其他任何函数)点击附加的DOM项,并且在插件之外执行该操作不起作用,因为我们是跨域和异步的

我想我需要在运行时将任意函数传递给插件,但这是我所能做到的。我曾经尝试过delegate()/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); ???  
该插件如下所示:

        $(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); ???  
(函数($){
$.fn.myPlugin=函数(选项){
$.ajaxSetup({cache:true,async:false});//false不起作用-跨域
var默认值={count:5};
var options=$.extend(默认值,选项);
返回此.each(函数(){
var obj=$(本);
$.ajax({
键入:“GET”,
async:false,
数据类型:“json”,
数据:{},
网址:'http://someurl.com?callback=?&otherstuff=somedata',  
成功:函数(数据){
$.each(data.results,function(i,item){
t=$(
  • +item.text
  • ')。附录(obj); //这可以工作,但可能需要任意jQuery.ui函数 //t=$(item.text).appendTo(obj.draggable(); //也许是这样,但不确定该怎么做 //$(t).trigger(ArbitraryEventHandler)???
    这看起来是在jQuery 1.5中使用新的的一个很好的例子(它
    $.ajax()
    可以在后台使用。基本上,它允许您在ajax调用成功完成时排队执行回调(或者在出现错误时被调用)。

    将回调传递给您的插件。类似于:

    $('#targetDiv').myPlugin({ count: 10, callback: function(element){
        element.draggable(); // Or whatever you want to do with your item
    }});
    
    然后在ajax success中调用此回调,例如:

        success: function (data) {  
            $.each(data.results, function (i, item){  
               t = $(<LI class='foo'> + item.text </LI>').appendTo(obj);  
               options.callback(t); 
    
    成功:函数(数据){
    $.each(data.results,function(i,item){
    t=$(
  • +item.text
  • ')。附录(obj); 选项。回调(t);
    谢谢你的回答,我想在某个时候看看1.5,我会确定它是否有效(听起来不错)…当其他人发布基本相同的解决方案时,我提出了以下内容,但有点干净…问题解决了,谢谢大家

    首先,在DocumentReady块外部创建如下任意函数:

    function myArbitraryFunction(t) { // do some work...}
    
    然后向插件选项添加一个选项:

    var defaults =  {
        count: 5,
        itemFunction:null};
    
    然后在对插件的调用中,这一点的魔法最终将传递一个指向ArricryFunction的指针作为选项值

    $("#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)
            }
    ....
    
    成功:函数(数据){
    $.each(data.results,function(i,item){
    t=$(
  • +item.text
  • ')。附录(obj); //这就是魔术!! if(option.itemFunction!=null){ 选项.项函数(t) } ....

    需要连接的部件很多,但到目前为止,它似乎可以工作……

    非常感谢……看起来我得出了大致相同的答案(见下文),尽管您的电话中的功能看起来更干净……非常感谢!