【问题标题】:get the div object that holds a jquery widget from inside the widget从小部件内部获取包含 jquery 小部件的 div 对象
【发布时间】:2012-01-23 01:43:24
【问题描述】:

我有以下代码:

<div id="widHolder"></div>
<script type="text/javascript" language="javascript">
    $('#widHolder').widgetName({
        optionOne: false,
        optionTwo: 1,
        onComplete: function (holder) { 
            // ... do something here with the 'widHolder' object such as $(holder).addClass(x,y) 
        }
    });
</script>

在小部件本身内,onComplete 方法将在小部件完全初始化后立即调用。我希望小部件中的代码引用小部件链接到的对象(在本例中为 id 为“widHolder”的 div)。

我的目标是通过创建上面列出的 oncomplete 函数来快速轻松地引用持有对象。小部件本身的代码只是调用 onComplete 函数,将持有者(我需要获取)作为参数传递。

这里是 jQuery UI Widget 插件的代码示例

(function ($) {
    $.widget("ui.widgetName", {
        options: {
            // ... other options that can be set
            onComplete: undefined
        },

        // called on the initialization of the widget
        _init: function () {
            // do initialization functions...

            if(this.options.onComplete)
                this.options.onComplete( I_WANT_TO_SEND_THE_DOM_ELEMENT_HERE );
        },
    }
})

【问题讨论】:

  • 我们能否提供一个指向您正在使用它的页面的链接,或者查看更多代码。不管代码有多长,解释发生的事情比理解代码更难。

标签: jquery jquery-ui widget jquery-widgets


【解决方案1】:

jQuery UI Widget Factory 通过以下方式使元素可用:

this.element 来自插件。

更多信息,请看这里:http://wiki.jqueryui.com/w/page/12138135/Widget%20factory

这样能更好地回答你的问题吗?

(function ($) {
    $.widget("ui.widgetName", {
        options: {
            // ... other options that can be set
            onComplete: undefined
        },

        // called on the initialization of the widget
        _init: function () {
            // do initialization functions...

            if(this.options.onComplete)
                this.options.onComplete( this.element );
        },
    }
})

附注 - 如果您在插件中创建另一个闭包,则需要保存对 this 的引用。例如:

(function ($) {
    $.widget("ui.widgetName", {
        options: {
            // ... other options that can be set
            onComplete: undefined
        },

        // called on the initialization of the widget
        _init: function () {
            // do initialization functions...
            var self = this;
            $.each(an_array_or_something_obj, function(){
                //here this will refer to the current element of the an_array_or_something_obj
                //self will refer to the jQuery UI widget
            });
            if(this.options.onComplete)
                this.options.onComplete( this.element );
        },
    }
})

【讨论】:

  • 我的理解是,如果我在小部件中使用“this”,那么我指的是小部件本身。我在整个小部件中使用了很多很多次,但这不是我在这里想要做的。在这里,我不想返回小部件本身,而是返回小部件链接到的容器。我确信我可以使用类似“this.container”的东西,但我不知道那个语法是什么。
  • 回答您的问题 - 这是一个 jQuery UI 插件。我宁愿不发布完整的插件代码,因为它非常广泛,这只是对完整插件的一个小更新。
  • @Adam - jQuery UI 为您处理一些基本的管道,例如设置属性 element 以引用调用小部件的 DOM 元素。我将其添加到您的示例中并在上面编辑了我的答案。
  • 嘿-谢谢...昨晚通过代码我也发现了这个。 “this.element”正是我所需要的。
【解决方案2】:

使用this.offsetParent,如在您的示例中,持有者是小部件的直接父级。

【讨论】:

  • 我试过 this.offsetParent 和 $(this).offsetParent 但都没有成功。我把这些放在上面写着 I_WANT_TO_SEND_THE_DOM_ELEMENT_HERE 的地方。我已更新问题以包含插件代码示例。也许我做错了什么 - 如果我遗漏了什么,请告诉我。
  • @Adam,对不起,this 的范围在 JavaScript 中总是让我难以理解。试试console.log(this) 看看它指的是什么。
  • @Walkerneo - 这总是指闭包。因此,在 Adam 的案例中,jQuery UI Widget。在普通的 jQuery 插件中,init 方法中的 this 将引用调用插件的 jQuery 对象。
  • @Jonathan,实际上,this 指的是作为第二个参数传递的对象。除非这就是你的意思,虽然我不知道。
  • @Walkerneo $.widget(); 的第二个参数?那是对的。第一个参数是小部件的命名空间,第二个参数是小部件本身。我们谈论的是同一个对象。
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多