【问题标题】:How to create listview with buttons inside clickable list items in Jquery Mobile如何在 Jquery Mobile 的可点击列表项中创建带有按钮的列表视图
【发布时间】:2014-06-11 10:22:22
【问题描述】:

有什么方法可以在 Jquery Mobile 中创建一个列表视图,该列表视图具有可点击的列表项,并且每个项都有 3 个按钮?我不想使用拆分按钮列表视图。我试图创建它,但按钮点击不起作用。单击任何按钮的行为就像单击列表项一样。

【问题讨论】:

  • 您使用的是哪个 jQM 版本?

标签: jquery-mobile jquery-mobile-listview


【解决方案1】:

您可以将e.stopImmediatePropagation(); (http://api.jquery.com/event.stopimmediatepropagation/) 添加到按钮点击中,这样它们就不会传播到父列表项。

更新:

在 cmets 中提到的 OP 列表项是动态生成的。原始代码仍然有效,因为按钮使用了事件委托 (https://learn.jquery.com/events/event-delegation/)。这是一个更新的示例:

标记中的空 UL

<ul data-role="listview" id="thelist">
</ul>

在页面创建时,填充列表视图并添加点击处理程序

$(document).on("pagecreate", "#page1", function(){

    //make list dynamically
    var allItems = '';
    for (var i=0; i< 4; i++){
         allItems += '<li data-rowid="' + i + '"><a href="#"><div data-role="controlgroup" data-type="horizontal"><input type="button" value="Hmm" /><input type="button" value="No" /><input type="button" value="Yes" /></div>&nbsp;Item ' + i + ' text or description</a></li>';   
    }
    $("#thelist").empty().append(allItems).listview("refresh").enhanceWithin();


    $("#thelist").on("click", "li input", function(e){
        e.stopImmediatePropagation();        
        var rowid = $(this).parents("li").data("rowid");
        var btnText = $(this).val();
        alert("You clicked the button: " + btnText + " on row number: " + rowid);
    });

    $("#thelist").on("click", "li a", function(e){
        alert("You clicked the listitem");
    });

});

更新DEMO

原文:

DEMO

<ul data-role="listview" id="thelist">
    <li data-rowid="1">
        <a href="#">            
            <div data-role="controlgroup" data-type="horizontal">
                <input type="button" value="Hmm" />
                <input type="button" value="No" />
                <input type="button" value="Yes" />
            </div>
            Item 1 text or description
        </a>
    </li>
</ul>

$(document).on("pagecreate", "#page1", function(){

    $("#thelist li").on("click", "input", function(e){
        e.stopImmediatePropagation();        
        var rowid = $(this).parents("li").data("rowid");
        var btnText = $(this).val();
        alert("You clicked the button: " + btnText + " on row number: " + rowid);
    });

    $("#thelist li").on("click", "a", function(e){
        alert("You clicked the listitem");
    });

});

您还可以将按钮放在 listitem 锚标记之外,并使用 CSS 很好地定位所有内容...

【讨论】:

  • 谢谢。这在这个例子中工作得很好。但在我的情况下,列表行是动态生成的。在这种情况下,既不会触发列表项单击,也不会触发按钮单击。有什么想法吗?
  • @Adnan,我已经更新了我的小提琴以动态创建列表项:jsfiddle.net/ezanker/y79GW/2 因为我的事件处理程序正在使用事件委托,所以它们仍然可以正常工作。如果您的 UL 也是动态创建的,则需要将处理程序放在文档上,然后委托给按钮/列表项。
  • @Adnan,我已经用动态列表项更新了我的答案和 FIDDLE。
  • 谢谢。我明白了。
  • 顺便说一句,这仅在您先填充列表然后绑定点击事件时才有效。我更改了您的示例代码以首先绑定点击事件,然后填充列表并且点击停止工作。 jsfiddle.net/y79GW/4
猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多