更改按钮文本 jquery mobile

Posted

技术标签:

【中文标题】更改按钮文本 jquery mobile【英文标题】:Change button text jquery mobile 【发布时间】:2011-04-29 21:36:20 【问题描述】:

我正在使用新的 jquery mobile 1.0 alpha 1 版本来构建移动应用程序,并且我需要能够切换按钮的文本。切换文本可以正常工作,但是一旦执行文本替换,css 格式就会被破坏。

格式混乱的屏幕截图:http://awesomescreenshot.com/03e2r50d2

    <div class="ui-bar">
        <a data-role="button" href="#" onclick="Podcast.play(); return false" id="play">Play</a>
        <a data-role="button" href="#" onclick="Podcast.download(); return false" id="download">Download</a>
        <a data-role="button" href="#" onclick="Podcast.consumed(); return false" id="consumed">Mark Old</a>
    </div>

$("#consumed").text("Mark New");

【问题讨论】:

你为什么在 html 中使用 onclick 和 jQuery? 【参考方案1】:

当您创建按钮时,它会添加一些额外的元素,一些内部的 &lt;span&gt; 元素看起来像这样:

<a data-role="button" href="#" onclick="Podcast.consumed(); return false" id="consumed">
  <span class="ui-btn-inner ui-btn-corner-all">
    <span class="ui-btn-text">Mark Old</span>
  </span>
</a>

要更改文本,您需要这个选择器:

$("#consumed .ui-btn-text").text("Mark New");

【讨论】:

应该有更好的方法来实现这一点,例如使用$('ul').listview('refresh'); 调用来更新列表。尽管所描述的方式有效,但它考虑了元素最终布局的内部知识。这个实现细节将来可能会改变。但由于 jquery mobile 仍处于 alpha 阶段,+1 为务实的解决方案。 我遇到了这个问题,因为最初的问题有点误导(尽管尼克的回答是正确的)。但我只想补充一点,对于其他使用实际 -1 > 这里的正确做法是在 DOM 更新后运行 $('#myButton').button('refresh')。 @StevendeSalas - 在给出这个答案时,这不是行为,它没有效果 - 在这种情况下,您应该编辑答案以表明更新/更好的方法已经添加到库中. 当我投票否决这个答案时,我添加了正确答案,它在底部未被注意到。【参考方案2】:
<a data-role="button" href="#" id="consumed">Mark Old</a>

你想:

$('#consumed').text('Mark New');
$('#consumed').button('refresh');

原因是为了使您的更改能够向后兼容 jQuery mobile 的未来版本。

【讨论】:

此方法失败,并出现“未捕获的异常:无法在初始化之前调用按钮上的方法;尝试调用方法‘刷新’”时,我尝试此操作(Firefox 12.0)。接受的答案对我有用。使用 jQM 1.1.0 和 jQ 1.7.1。 接受的答案有点拙劣,尽管它可以工作,但您希望尽可能多地使用 jQuery API 以确保未来的兼容性。初始化按钮后,此答案将正常工作,请确保将代码包装在 $(document).ready(function() ... ); 即使按钮已初始化,这也不起作用。 jsfiddle.net/4Bgx7/1405 -1。我不赞成投票,因为这是作为一个适当的解决方案被推送的,但基于 jQuery Mobile 文档本身,这不适用于链接按钮。引用docs:“基于链接的按钮不是按钮插件的一部分,仅使用底层的 buttonMarkup 插件来生成按钮样式,因此表单按钮方法(启用、禁用、刷新)不是” t 支持。” 我只使用 val 而不是文本: $('#consumed').val('Mark New'); $('#consumed').button('refresh');【参考方案3】:

我在网上阅读了这个和各种选项,并认为我可能有一个更简单的解决方案。它绝对适用于您正在变成具有 data-role="button" 属性的按钮的链接。

只需将按钮的文本放在一个单独的 span 中,然后在 javascript 中更改 span 的内容。

例如

<a data-role="button" href="#" id="consumed"><span id="oldBtnText">Mark Old</span></a>

然后一个简单的

$('#oldBtnText').html("Old");

将完成这项工作。如果 jQuery 改变它们的结构也应该不是问题。

【讨论】:

这是唯一适用于 jQM 1.4.0 的方法。我没有看到尼克在他的回答中引用的嵌套跨度。 B-E-A-U-T-I-F-U-L。这就像昂贵的钢笔在太空中使用铅笔溶液的笑话。【参考方案4】:

我为基于链接的按钮或&lt;input type="button"&gt; 按钮编写了一个简单的插件来执行此操作。所以如果你有

<input type="button" id="start-button" val="Start"/>

<a href="#" data-role="button" id="start-button">Start</a>

无论哪种方式,您都可以更改显示的文本

$("#start-button").changeButtonText("Stop");

这是插件:

(function($) 
    /*
     * Changes the displayed text for a jquery mobile button.
     * Encapsulates the idiosyncracies of how jquery re-arranges the DOM
     * to display a button for either an <a> link or <input type="button">
     */
    $.fn.changeButtonText = function(newText) 
        return this.each(function() 
            $this = $(this);
            if( $this.is('a') ) 
                $('span.ui-btn-text',$this).text(newText);
                return;
            
            if( $this.is('input') ) 
                $this.val(newText);
                // go up the tree
                var ctx = $this.closest('.ui-btn');
                $('span.ui-btn-text',ctx).text(newText);
                return;
            
        );
    ;
)(jQuery);

... 因为在代码中添加依赖于 jQuery Mobile 呈现这些按钮的确切方式并不是一个好主意。编程规则:如果您必须使用 hack,请将其隔离为有据可查、可重用的代码块。

【讨论】:

我喜欢这个解决方案,因为如果某天在 jQuery Mobile 中更改了类 .ui-btn-text,则只需更改几行代码,而不是一堆 html 和 javascript。 最佳解决方案,就像一个魅力一样,正如 Libby 指出的那样,黑客通过抽象变得干净。【参考方案5】:

这对我有用:

$('#idOfOriginalButton').prev('.ui-btn-inner').children('.ui-btn-text').html('new text');

解决方案来自: http://forum.jquery.com/topic/changing-text-works-except-for-buttons

【讨论】:

+1 因为这允许您在单击按钮时更改文本。 $("button").bind("click", function(event, ui) $(this).prev('.ui-btn-inner').children('.ui-btn-text').html('new text'); return false; );【参考方案6】:

对于像

这样的标记
<button id="consumed">Mark Old</button>

$("#consumed").html("Mark New");
$("span > span", $("#consumed").parent()).html("Mark New");

【讨论】:

【参考方案7】:

在新的 jquery 移动版本中,按钮内有一个内部 span 标签。

所以你不必更改'a'标签的文本,而是更改内部跨度的文本。

例如

$("#consumed .ui-btn-text").text("test");

【讨论】:

【参考方案8】:

从 JQM 1.3.1(可能更早?)开始,似乎支持简单的 .text()。

【讨论】:

【参考方案9】:

对于那些对简单解决方案感兴趣的人,我创建了一个名为 Audero Text Changer 的插件。

【讨论】:

【参考方案10】:

由于某种原因,我第一次想更改按钮文本时没有分类为“ui-btn-text”的跨度。所以我像这样解决它:

var button = $("#consumed");
var innerTextSpan = button.find(".ui-btn-text");

// not initialized - just change label
if (innerTextSpan.size() == 0) 
    button.text(label);

// already initialized - find innerTextSpan and change its label    
 else 
    innerTextSpan.text(label);

【讨论】:

以上是关于更改按钮文本 jquery mobile的主要内容,如果未能解决你的问题,请参考以下文章

单击时Jquery向下滑动切换更改按钮文本和图标

通过jQuery更改鼠标悬停时的动态按钮文本[复制]

动态更改 jQuery UI 对话框按钮文本

悬停html文本更改上的Jquery

根据每个表格行中的单元格值更改按钮文本 - Jquery

jQuery可以更改输入提交类型的文本但按钮不再可点击