【问题标题】:jQuery calling function from newly loaded div从新加载的 div 调用 jQuery 函数
【发布时间】:2012-11-29 22:36:10
【问题描述】:

我有新的 div 我正在加载到名为“Next”的主页中。 “Next” div 是一个位于 Story.php 页面上的按钮,我正在使用此代码加载它。

$('.CoolBox').load('Story.php', function() 
    {
 /// The "Next div" is NOW on display but not recognized by main page that loaded it.
    });

但是如果我尝试让“Next”div 调用一个函数或可点击它就不起作用了。

$("#Next").click(function() 
    {
/// Run my code. Call a function?

    });

我意识到有两种选择。将代码放在我正在加载的页面中,以便 jQuery 可以看到“Next”div。我这样做了,当我单独加载“Story.php”页面时它工作正常,但是当我将该页面加载到主页时它不再工作。

同样的概念我也需要应用于函数。如何创建调用尚未加载到页面上的 div 的函数?

我是将可以访问该页面上的 div 的函数放在 Story.php 中,还是将这些函数放在主页上并以某种方式“注册”新加载的 div?

我想我也许可以使用类似...

document.getElementById("#Next") /// but what is the full code I use?

更新: 完整的代码可以在名为 testing.php 的页面上看到 http://beaubird.com/testing.php 单击名为 STORY 的第一个按钮。然后注意底部名为 Next 的按钮。这也有一个 div 名称为“Next”。我希望“下一个”div 能够加载更多故事并控制页面上的其他元素。

第 366 行是我调用此代码的地方:

$('.CoolBox').load('Story.php', function() 
                {
        /// it loads this page http://www.BeauBird.com/Story.php
                // Where the Next div is contained. 
                });
        }

有什么想法吗?非常感谢!

【问题讨论】:

    标签: jquery function html load


    【解决方案1】:

    您可以使用delegated events 来解决问题:

    $(".CoolBox").on("click", "#Next", function() {
        /// Run my code.
    });
    

    这里我们将.CoolBox 视为#Next静态父元素

    【讨论】:

    • 如果#Next 不会嵌套在.Coolbox 内,也许您还可以添加注释。
    • @TravisJ 您可以使用任何适当的信息来完成我的回答;)
    • 我试过这个方法,但它不起作用。以下是本网站的完整代码:beaubird.com/testing.php 点击“故事”进行加载。然后你会看到一个下一步按钮,它是一个标志...加载页面。查看代码并在 #225 处查看您的代码行。它看不到已加载的#Next div,并且在单击时不会隐藏。
    【解决方案2】:

    我希望你已经展示了接下来添加的代码。但是没有看到它,试试这个:

    var nxt = document.createElement("div");
    $(nxt).click(function(){ /* code */ };
    someNode.appendChild(nxt);
    

    编辑

    如果你想走这条路,这里是一个事件委托的例子:http://jsfiddle.net/k3fvd/

    具体说明

    在链接的页面中,委托代码

    $(".CoolBox").on("click","#Next",function(){
      /* code */
    });
    

    正在按预期工作。也许意料之外的是div id="layer2" 正在窃取点击事件,因为它在z-index 或元素列表中以某种方式更高。我不完全确定是什么原因造成的,也许是所有的 div 都被定义为display:block; 并且以某种方式覆盖了position:absolute;。一个简单的解决方法是为position:absolute; 提供更多的特异性,如下所示:

        #layer2  {
    position: absolute important!; 
    left: 1px;
    top: 0px;
    z-index: 3;
    width: 1246px;
    height: 1031px;
    margin-left: 0px;
    margin-top: 0px;
    background-image: url(sg_jesus_media/layer2.gif);
    background-repeat: no-repeat;
    }
    

    请注意,position:absolute important!; 已被编辑。这应该允许您的 div id="Next" 元素接收点击事件。

    【讨论】:

    • @JamesMontagne - 这是一个评论版本的创作,显示...“//The "Next div" is NOW on display”。使用此方法,根据范围,可以将细节添加到单击事件中,而不是像其他答案所建议的那样使用通用委托。
    • @PapaDeBeau - 我已经意识到你的问题是什么,请参阅我的最后编辑以获得解释。
    • 非常感谢。好的,但只有当我打开萤火虫时才有效。真奇怪。我更新了代码,你可以看到我在说什么。使用火狐。
    • 我想我明白了。有一个名为“BeauIntro”的 div,它可能会覆盖其他 div。我删除了它,它似乎工作。你摇滚!
    【解决方案3】:

    需要委派事件强调文字

    $("body").on('click', "#Next" ,function() {
    
    });
    

    "body" 可以替换为静态祖先。

    【讨论】:

    • 我也试过这种方法,但它不起作用。以下是本网站的完整代码:beaubird.com/testing.php 点击“故事”进行加载。然后你会看到一个下一个按钮,它是底部的一个标志。查看代码并在 #233 处查看您的代码行。它看不到已加载的#Next div,并且在单击时不会隐藏。
    猜你喜欢
    • 2012-12-02
    • 2011-12-24
    • 2014-01-26
    • 1970-01-01
    • 2017-06-25
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多