【问题标题】:Why can I not use $find in a jQuery function?为什么我不能在 jQuery 函数中使用 $find?
【发布时间】:2010-12-07 01:41:36
【问题描述】:

我正在使用 jQuery 和 IScriptControls 的组合,但我似乎无法在任何 jQuery 函数中使用 $find。

以下面为例,我可以使用$get和$,但我不能使用$find。

    // Configure the toolbar groups
    $(document).ready(function()
        {

            // Returns the control
            var works1 = $get("ctl00_ContentPlaceHolder1_uwt_MainNavigation");
            var works2 = $("#ctl00_ContentPlaceHolder1_uwt_MainNavigation");

            // Returns null
            var broken = $find("ctl00_ContentPlaceHolder1_uwt_MainNavigation");

        }
    );

当我的页面加载时,我需要调用一个方法,该方法需要从我的 MainNavigation Tab 控件中获取选定的选项卡(这是一个 Infragistics UltraWebTab,但我已经使用我自己的 IScriptControls 进行了测试,以确保这不是 Infragistics 问题)。

标签索引只能通过 $find 获取。我无法使用 $find 的原因是什么?如何以 $find 方式获得控件?

// Configure the toolbar groups
$(document).ready(function()
    {

        // Get the UltraWebTab Control
        var tabControl = $find("<%=uwt_MainNavigation.ClientID %>");
        var index = tabControl.get_selectedTab();
        ToolBarShowGroup(index);

    }
);

以上是我正在尝试做的,其中 ToolBarShowGroup 调用一个 jQuery 函数来显示和隐藏工具栏。

另外,虽然我听说,如果有人可以纠正我关于 IScript 控件的术语......他们是“Ajax 控件”还是“扩展器控件”还是什么?我已经看到它们被称为所有不同的东西。控件具有 ol' MyCompany.MyControl.prototype 声明。

编辑:以下工作完美,但我宁愿它在 $(document).ready 函数内。

// Use the Ajax Load Methods
function pageLoad()
{
    var ajaxControl= $find("<%=myControlHere.ClientID %>");
}

【问题讨论】:

  • 只是补充一下,对于 Infragistics 控件,我需要使用 igtab_getTabById 而不是 $find,但我还有其他控件必须通过 $find 访问,这些控件在 $(document) 中仍然不起作用。准备好了。

标签: asp.net jquery terminology iscriptcontrol


【解决方案1】:

您似乎正在将 jQuery 与其他库一起使用,这些库也重新定义了 $ 函数。您可以使用 noConflict 函数,该函数会强制您始终使用 jQuery 而不是 $

jQuery.noConflict();


// Configure the toolbar groups
jQuery(document).ready(function() {
    // Returns the control
    var works1 = $get("ctl00_ContentPlaceHolder1_uwt_MainNavigation");
    var works2 = jQuery("#ctl00_ContentPlaceHolder1_uwt_MainNavigation");
    // Returns null
    var broken = $find("ctl00_ContentPlaceHolder1_uwt_MainNavigation");
});

jQuery(document).ready(function() {
    // Get the UltraWebTab Control
    var tabControl = $find("<%=uwt_MainNavigation.ClientID %>");
    var index = tabControl.get_selectedTab();
    ToolBarShowGroup(index);
});

【讨论】:

  • 当不在 jQuery 函数中时,我可以使用 $find。 IE。如果我只是在一个普通的 JS 函数中,我可以在同一个函数中使用 jQuery 和 $find、$get。一旦我在一个 jQuery 函数中,$find 就会失效。我已经尝试过你的建议,但没有任何区别。
【解决方案2】:

我不确定你为什么会遇到这个问题,但你为什么不直接使用 jQuery 对象呢? 喜欢:

var mainNav = $("#ctl00_ContentPlaceHolder1_uwt_MainNavigation");

或者如果你想要DOM对象而不是jQuery对象,你可以写成:

var mainNav = $("#ctl00_ContentPlaceHolder1_uwt_MainNavigation")[0];

【讨论】:

  • 因为它们返回的属性与 $find 方法不同。 $find 将返回控件的 get_ 和 set_ 方法以及我的所有私有成员。 $(control)[0] 与 $get 相同。
【解决方案3】:

这应该可行:

$(document).find("#elementid")

或者,如果您在事件处理程序中调用它,那就更好了:

$(this).find("#elementid")

我认为 find 函数的想法是找到父控件的后代。因此,如果您不指定父级,它似乎不起作用。

但是,从外观上看,您不需要使用 find 来执行您正在做的事情。为什么不简单地这样做呢?

$("#elementid")

【讨论】:

  • 他还有一些名为 $find() 的库函数。他这里不是在说 jQuery 的 find 函数。
  • Technowise,你确定吗?因为我刚刚测试了 find 并且它不像他写的那样工作。我必须指定(文档)它才能工作。
  • 是的,我确定。他试图使用的功能在这里解释:mattberseth.com/blog/2007/08/…
  • 我不想做一个 jQuery 查找。我正在尝试使用 Ajax Find 方法。
  • Ajax Find 方法公开了所有 Ajax 属性和方法。
【解决方案4】:

如何在 document.ready 之外重新定义 $find 函数

var FIND_FUNCTION = $find;

$(document.ready) { 
   ...
   var result = FIND_FUNCTION("ctl00_ContentPlaceHolder1_uwt_MainNavigation");
}

这应该可以解决您似乎遇到的范围界定问题。

【讨论】:

  • 看起来不错,但是不对。我开始认为在 $(document).reader 被触发时实际上并没有创建控件。不过好主意! +1
【解决方案5】:

似乎 jQuery 的 $(document).ready 在构建 Ajax 控件之前触发。

我完成这项工作的方法是使用以下由 Ajax 框架触发的 JavaScript 方法:

function pageLoad()
{
    // $find() works in here
}

pageLoad() 在 $(document).ready 之后触发,所以看起来当 jQuery 的函数触发说文档准备好时……实际上还没有准备好?

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 2014-05-09
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多