【问题标题】:$().next() returning the same element multiple times$().next() 多次返回相同的元素
【发布时间】:2015-05-18 16:10:55
【问题描述】:

我尽量命名标题。我有点难以解释。

我正在编写的一些代码(在我的 wordpress 网站上的小部件中运行)遇到问题。我在这里写的内容模拟了这个问题。仅供参考,我对 jquery、JS 等非常陌生。

我正在尝试将变量“thumb”设置为“widget-code”之后的元素。它可以工作,但是它只能在“wordpress-post1”中找到那个元素(“thumb-class”)

控制台输出为:

wordpress-post1
wordpress-post1
wordpress-post1

但应该是:

wordpress-post1
wordpress-post2
wordpress-post3

这是实际代码

<div class="wordpress-post1">
    <div id="widget-code">
        <script>
            $(document).ready(function(){
                var thumb = $("#widget-code").next();
                console.log(thumb[0].parentElement.className);
             });
        </script>
    </div>
    <div class="thumb-class">
    </div>
</div>
<div class="wordpress-post2">
    <div id="widget-code">
        <script>
            $(document).ready(function(){
                var thumb = $("#widget-code").next();
                console.log(thumb[0].parentElement.className);
             });
        </script>
    </div>
    <div class="thumb-class">
    </div>
</div>
<div class="wordpress-post3">
    <div id="widget-code">
        <script>
            $(document).ready(function(){
                var thumb = $("#widget-code").next();
                console.log(thumb[0].parentElement.className);
             });
        </script>
    </div>
    <div class="thumb-class">
    </div>
</div>

我将尝试再澄清一点:

此代码放置在我使用的 wordpress 主题提供的 html 小部件中。它与每个帖子挂钩。这是我唯一可以放代码的地方,也是我写的唯一代码。 (我没有以任何方式更改主题文件。)

我无法控制类或 ID 的名称。它们是动态的。可以存在无限数量的帖子。因此我不能硬编码任何东西。

为了让这段代码正常工作,它只需要在运行它的帖子中找到“widget-code”元素的兄弟。

这是 JSFiddle 上代码的链接:http://jsfiddle.net/pattnvy3/

对于此事的任何帮助将不胜感激。

【问题讨论】:

  • 您不能有多个具有相同 ID 的元素。
  • id 在页面上必须是唯一的
  • 无效标记......每个元素的 ID 必须是唯一的。
  • ID 应该是唯一的。
  • jsfiddle.net/arunpjohny/19q6zvax/1 - 您可以使用单个 js 块在其中迭代每个 widget-code 元素并找到其父元素

标签: javascript jquery css wordpress


【解决方案1】:

如果你想要一个讨厌的黑客,试试

<div class="wordpress-post1">
    <div id="widget-code">
        <script>
            $(document).ready(function(){
                var c = window['widget-code-counter'] || 0;
                window['widget-code-counter'] = ++c;
                var className = 'wordpress-post' + c;
                console.log(className);
             });
        </script>
    </div>
    <div class="thumb-class">
    </div>
</div>

演示:Fiddle

它会给容器类wordpress-post1,然后你可以用它来查找任何后代元素。

【讨论】:

    【解决方案2】:

    根据直接 cmets,对多个元素使用 id 是无效标记。也就是说,将您的 id 更改为这样的类:

    <div class="wordpress-post[some-number-here]">
        <div class="widget-code">
        </div>
        <div class="thumb-class">
        </div>
    </div>
    

    将允许您像这样使用 jQuery 选择器:

    $('.widget-code').each(function (){
        var thumb = $(this).next();
        console.log(thumb[0].parentElement.className);
    });
    

    但是,如果我可以提出建议,我会说您将每个 wordpress-post div 标记为“wordpress-post”类,然后有一个更具体的 id,即您要打印的值。

    然后它看起来像这样:

    <div id="wordpress-post[some-number-here]" class="wordpress-post">
        <div class="widget-code">
        </div>
        <div class="thumb-class">
        </div>
    </div>
    

    你的 javascript 像这样(使用 jQuery):

    $('.widget-code').each(function (){
        var post = $(this).closest('.wordpress-post');
        console.log(post.attr('id'));
    });
    

    甚至更简单:

    $('.wordpress-post').each(function (){
        console.log($(this).attr('id'));
    });
    

    取决于您的需求。如果您对需要什么有任何疑问,请随时发表评论,我会尽快回复您。

    【讨论】:

    • 谢谢。不幸的是,我遇到的问题是代码只需要找到它所属的帖子的元素。我不能有一个运行和迭代所有元素的函数。将为每个帖子调用此代码 - 我无法控制它。所以代码本身只能从它运行的地方找到正确的元素。
    • 所以澄清一下,这是在按下按钮时触发的东西,还是在页面加载时触发的东西?
    • @GKnight 我会假设页面加载/准备好,因此$(document).ready(function() { });
    【解决方案3】:

    纯javascript方法:

    这只是一种解决方法,因为您无法控制 idsclasses,这将针对页面上的所有 div 元素,循环遍历它们并搜索类名中包含 wordpress-post 的任何元素。

    window.onload=function(){
    var posts=document.getElementsByTagName('div');
     for(var i=0; i<posts.length; i++){
       if(posts[i].className.indexOf("wordpress-post")> -1){
         console.log(posts[i].className);
         //Snippet Use 
         alert(posts[i].className);
       }
    }}
    <div class="wordpress-post1">
        <div id="widget-code"></div>
        <div class="thumb-class"></div>
    </div>
    <div class="wordpress-post2">
        <div id="widget-code"></div>
        <div class="thumb-class"></div>
    </div>
    <div class="wordpress-post3">
        <div id="widget-code"></div>
        <div class="thumb-class"></div>
    </div>

    如果您有任何问题,请在下方留言,我会尽快回复您。

    我希望这会有所帮助。快乐编码!

    【讨论】:

    • 感谢您的帮助。但是,代码不能遍历所有元素,因为代码块将为存在的每个帖子运行。因此,如果有 10 个帖子,代码将被执行 10 次。所以它只需要找到它所属的帖子的元素。
    • @Tsel 我已经更新了答案,我确实删除了它,因为我不知道你无法控制 id/classes,但我想出了这个作为一种解决方法。
    • 嗯我仍然认为有同样的问题。你写的 JS 函数最终会被执行多少次。因此,它不仅会在运行代码的帖子中找到元素,还会找到所有元素。所以会有 post count^2 次迭代,我认为这是不好的。
    • @Tsel 你没有说函数什么时候被调用,我们只能通过你的 example/sn-p 而你的 sn-p 正在使用 onload/read 来触发该函数。据我所知,您还没有显示页面元素的来源,因为我知道这些元素是从加载的页面上。如果在页面加载后添加元素,那么我建议您显示添加它们的函数,因为这与您的问题和当前源代码相关。
    • 这很难解释,因为这不是我写的 wordpress 主题。该主题提供了一个 html 小部件,我相信它与 post 循环挂钩。我在该小部件中放入的任何内容都会显示在每个帖子中。当文档准备好时,代码就会运行。 (即,当整个页面加载完成时,包括所有帖子。)
    【解决方案4】:

    如果您想拥有多个 ID,这会有所帮助:

    $(document).ready(function(){
        $("[id^=widget-code]").each(function(){
            console.log(this.parentElement.className);
        });
    });
    

    但是,仍然不建议使用多个相同的 Id。

    FIDDLE

    更新:声明一个全局变量var i=0;并保持递增:

    <div class="wordpress-post1">
        <div id="widget-code">
            <script>
                var i=0;
                $(document).ready(function(){
                    var thumb = $("[id^=widget-code]").next();
                    console.log(thumb[i++].parentElement.className);
                 });
            </script>
        </div>
        <div class="thumb-class">
        </div>
    </div>
    <div class="wordpress-post2">
        <div id="widget-code">
            <script>
                $(document).ready(function(){
                    var thumb = $("[id^=widget-code]").next();
                    console.log(thumb[i++].parentElement.className);
                 });
            </script>
        </div>
        <div class="thumb-class">
        </div>
    </div>
    <div class="wordpress-post3">
        <div id="widget-code">
            <script>
                $(document).ready(function(){
                    var thumb = $("[id^=widget-code]").next();
                    console.log(thumb[i++].parentElement.className);
                 });
            </script>
        </div>
        <div class="thumb-class">
        </div>
    </div>
    

    DEMO

    【讨论】:

    • 不幸的是,我不能有一个迭代所有元素的函数。相反,代码只能在它所属的帖子中找到元素。这可能是不可能的。
    • 每篇文章只能执行一段代码。换句话说,它必须完全一样。所以我不能像那样硬编码它。
    • @Tsel 好吧,您可以通过声明全局变量 i 并将其递增 1 来做到这一点,请参阅答案..这应该对您有所帮助。
    • 不幸的是,我没有在哪里添加全局变量。我唯一可以添加代码的地方是 html 小部件。
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多