jQuery find()在AJAX结果上只工作一次?

jQuery find()在AJAX结果上只工作一次?,jquery,ajax,Jquery,Ajax,我对jQuery还不熟悉,我在使用jQuery方法操作AJAX结果时遇到了一些问题 我使用AJAXget并对结果输出执行find方法。但这似乎只起了一次作用。在find()参数中使用相同选择器的后续尝试无效。不同的选择器可以工作,但同样,只能工作一次 在遍历AJAX结果时,似乎发生了什么事情 AJAX调用 $.get('sections.htm', {}, function(data) { var $response = $('<div />').html(d

我对jQuery还不熟悉,我在使用jQuery方法操作AJAX结果时遇到了一些问题

我使用AJAX
get
并对结果输出执行
find
方法。但这似乎只起了一次作用。在
find()
参数中使用相同选择器的后续尝试无效。不同的选择器可以工作,但同样,只能工作一次

在遍历AJAX结果时,似乎发生了什么事情

AJAX调用

    $.get('sections.htm', {}, function(data) {
        var $response = $('<div />').html(data);
        showContent("teaser");

        function showContent(nav) {
            loadContent(nav);
            loadSlimboxHack();
            $('#content').fadeIn(400);
        }
这是可行的,但如果我再次尝试
showContent(“.triser”)
,它会失败,因为它似乎找不到任何东西,因此
#内容
会被覆盖而没有任何内容

看看我的网站,看看


乍一看,我认为您有问题

$response
变量不在事件处理程序的闭包范围内捕获(例如在单击->淡出->显示内容时)。我猜如果您传递
$response
变量,而不是尝试全局引用它,那么它将被修复。例如,以您的示例为例,如下所示:

$.get('sections.htm', {}, function(data) {
    var $response = $('<div />').html(data);
    showContent("teaser", $response);

    function showContent(nav, $response) {
        loadContent(nav, $response);
        loadSlimboxHack();
        $('#content').fadeIn(400);
    }
...
    function loadContent(nav, $response) {
    if (nav == 'teaser')
    {
        $('#content').html($response.find('.teaser'));
    }
...
$.get('sections.htm',{},函数(数据){
var$response=$('').html(数据);
showContent(“摘要”,$response);
功能显示内容(导航,$response){
装载内容(导航,$response);
loadSlimboxHack();
$(#content').fadeIn(400);
}
...
功能加载内容(导航,$response){
如果(导航=='striser')
{
$('#content').html($response.find('.trister'));
}
...

这样,您就可以保证当您使用它时,
$response
始终在那里。另一个选项是通过在
$(文档)之外声明它,使
$response
真正成为全局的.ready

谢谢,实际上我已经试过传递
$response
了,但运气不好。我又试了一次,还试过你提出的将
$response
全球化的建议。运气不好

最重要的是,
$response
loadContent()
中可用。似乎一旦找到选择器,就不能再“使用”?例如,一旦页面加载,就会发生以下情况

        if (nav == 'teaser')
        {
            $('#content').html($response.find('.teaser'));
        }
但是,点击其中一个预告图片将启动一个事件

    $('div.teaser_img').live("click", function() {
        var nav = $(this).attr("id");
        $('#content').fadeOut(400, function() {
            showContent(nav, $response);
        });
然后在
loadContent()中启动一个条件

                if (nav == projects[i])
                {
                    var tag = '#' + nav;
                    $('#content').html($response.find('div.teaser' + tag));
                    $('#content').append($response.find('div.concept' + tag));
                    break;
                }

因此,由于加载页面时已经找到了
div.trister
#content
只能使用
div.concept
来编写。其他任何选择器只要还没有使用过,都可以工作。

您可以使用$response的内容并将其中的一些内容附加到其他元素中。这意味着它们可以移动e从$response中退出并进入他们的新家,因此选择器只能工作一次

这样看吧。如果你从钱包里拿出你的一个,而且只有10美元,放在我的钱包里,下次你再看你的钱包时,它就不在了。为什么?因为它在我的钱包里。

@redsquare, 非常感谢!这使我走上了正确的道路

对于新手来说,
append()
在单个选择器上下文中的行为就像是“移动”而不是“复制”。这显然是新手中的一个常见错误。而且还没有完全记录在案?我现在感觉不太糟!:)

因此,在本例中,除了使用
append()
之外,我还需要使用
clone()

$('#content').append($response.find('div.concept' + tag).clone());
太好了!问题解决了

$('#content').append($response.find('div.concept' + tag).clone());