【问题标题】:jQuery Mobile: selecting by ID doesn't work welljQuery Mobile:按 ID 选择效果不佳
【发布时间】:2011-09-23 09:14:41
【问题描述】:

jQuery Mobile 有一个奇怪的问题... 下面是我的应用程序的 HTML 代码:

<!-- == START MAIN PAGE == -->
<div id="mainPage" data-role="page">
    <div data-role="header" data-position="fixed">
        <a href="#addContactPage" 
                data-transition="slidedown"
                data-rel="dialog"
                data-icon="plus"
                data-iconpos="notext">Add a contact</a>
        <h1>My repertory</h1>
    </div>
    <div data-role="content">
        <p>
            Welcome to your repertory! 
        </p>
        <ul id="contacts_list"></ul>
    </div>
    <div data-role="footer" data-position="fixed">
        <h1>Made with <em>jQuery Mobile</em></h1>
    </div>
</div>
<!-- == END MAIN PAGE == -->

<!-- == START ADD CONTACT PAGE == -->
<div id="addContactPage" data-role="page">
    <div data-role="header">
        <h1>My repertory: add a contact</h1>
    </div>
    <div data-role="content">
        <form id="addContactForm" action="#mainPage">
            <div data-role="fieldcontain">      
                <input type="submit" value="Valid" />
            </div>
        </form>
    </div>
</div>

当显示主页时,我想在

    列表中设置一个项目:

    //When the main page is created.
    $('#mainPage').live('pagecreate',function()
    {
        //Just after the page is shown
        $(this).bind('pageshow',function()
        {
            alert('Event triggered!');
            $('#contacts_list').html('<li>Reset list!</li>');
        });
    });
    

    所以,这是我的问题:当我启动应用程序时,此代码有效并且项目已设置。

    如果我打开“添加联系人页面”(请注意这是一个对话框)并关闭它,这段代码也可以正常工作,并且完成了预期的结果。

    但是如果我打开“添加联系人页面”然后提交它的表单,列表就会变成空的! alert() 已完成,因此触发了事件……但列表为空,就像未调用 html() 方法一样。 我试过提醒 *$('#contacts_list').lenght* 的值,它是 1,所以 jQuery 对象存在!

    请注意,在提交表单期间我什么都没做:它的 submit 事件没有监听器。

    如果我用这个替换代码:

    //When the main page is created.
    $('#mainPage').live('pagecreate',function()
    {
        //Just after the page is shown
        $(this).bind('pageshow',function()
        {
            alert('Event triggered!');
            $(this).find('#contacts_list').html('<li>Reset list!</li>');
        });
    });
    

    那就好办了!

    我真的不明白...

    为什么使用 $(this).find('#contacts_list') 而不是使用 $('#contacts_list') 完成预期结果?

    提前致谢!

    【问题讨论】:

    • 只是一个想法,如果对象存在可能需要刷新页面。试试这样的: $(this).find('#contacts_list').html('
    • Reset list!
    • ').trigger('create');或 $(this).find('#contacts_list').html('
    • 重置列表!
    • ').page('refresh');
  • 谢谢,但它不起作用:第一个代码没有任何变化,而第二个代码触发错误:在初始化之前无法调用页面上的方法;试图调用方法“刷新”。我提醒$(this).find('#contacts_list').html('&lt;li&gt;Reset list!&lt;/li&gt;'); 运行良好,是这段代码不起作用:$('#contacts_list').html('&lt;li&gt;Reset list!&lt;/li&gt;');。这就像两个 jQuery 对象不引用同一个 DOM 元素!
  • 标签: javascript jquery jquery-mobile


    【解决方案1】:

    看起来您提交表单会导致第二个事件绑定到页面显示。如果您删除(或更改)表单上的操作会发生什么?另外,请尝试:

    $(this).unbind('pageshow').bind('pageshow',function()...

    编辑

    我认为外部函数很可能是多余的。为什么不简化整个过程:

    $('#mainPage').live('pageshow',function()
      {
        alert('Event triggered!');
        $(this).find('#contacts_list').html('<li>Reset list!</li>');
      }
    );
    

    【讨论】:

    • 当我从表单中删除 Action 时,也会出现同样的问题。但是如果我在绑定之前尝试取消绑定 pageshow 事件,就会发生奇怪的行为:我第一次提交表单时列表仍然是空的,但第二次它按预期工作......我没有不明白为什么!此外,就像每次显示页面时都会触发 pagecreate 一样:我认为它仅在创建页面后才触发......!谢谢你的回答:)
    • 在这种情况下,听起来“实时”事件正在被复制。试试看:$('#mainPage').die('pagecreate').live('pagecreate',...
    • 出现与$(this).unbind('pageshow').bind('pageshow',function()...相同的问题。这种行为是 jQuery Mobile 的错误还是其他原因?
    • 回答您的编辑:jQuery Mobile 文档建议使用 pagecreate 事件。理论上,这个事件会触发一次,不是吗?无论如何,您提出的代码也有同样的问题:$(this).find('#contacts_list').html('&lt;li&gt;Reset list!&lt;/li&gt;'); 运行良好,但$('#contacts_list').html('&lt;li&gt;Reset list!&lt;/li&gt;'); 结果列表为空。可能是因为我在台式电脑上使用谷歌浏览器而不是在移动设备上?
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签