【问题标题】:jQuery mobile: problem with submitting forms due to page transitionsjQuery mobile:由于页面转换而导致提交表单的问题
【发布时间】:2011-06-21 15:34:08
【问题描述】:

我对在 jquery mobile 中尝试做的事情有点困惑。我的网站总共有大约 5 个页面,每个页面上都有相同的网络表单。我编写了一个使用 jquery ajax 处理表单的脚本。所有这些都适用于 index.html。

我的 index.html 中有一个 page2 div,用作我网站的第二页,但该表单似乎不起作用。

我还有一个 page3.html 页面。当我转到此页面时,它具有与我的主页相同的表单,但它不需要任何 jquery js,就像我使用 jquery 隐藏 p.error 行一样,它在主页上工作正常,但没有'在内部页面上根本不触发。

有没有办法解决这个问题?当涉及到在整个网站上具有相同的确切形式时,jquery mobile 中的一般建议是什么?现在,我只能让网络表单在我的主页上运行。

这是网站上的一些代码,首先是 js。

$(document).ready(function() {
     $('.error').hide();

     $(function() {
     $(".button").click(function() {
     ... form validations go here ...
     ... using $.ajax({ type: "post", data: datastring }) ...

我只是摘录了一段js代码。可能是 document.read 函数仅在主页上加载,然后所有内部页面都丢失了该脚本。那么,不是 index.htl 的页面,我应该以不同的方式触发我的表单脚本吗?

我将每个页面包装在一个 div 中,如下所示:

<div id="container" data-role="page">... my page content code here ...</div>
<div id="page2" data-role="page">... my page content code here ...</div>

每个页面都有相同的表单,但是当我转到第 2 页时,表单验证但它也与另一个表单冲突,所以我无法提交它,因为它总是将表单字段视为空白。

每个页面都包含指向其他页面的链接。当我单击转到不是 index 或 page2 的页面时,表单上没有任何作用(我的 p.error 语句可见,单击提交按钮将我发送到 405 错误页面)。当我从主页提交表单时,一切都按预期工作。如果我没有从下拉列表中选择某些内容,它会显示我的 p.error 短语。如果我将电子邮件地址字段留空,它将显示 p.error 短语以显示错误消息。

我很确定问题是 jquery mobile 如何劫持脚本并将内容加载到 DOM 中,我读到我只能在主页上加载一次 javascript。这是真的吗?

我正在寻找的最终结果是一种在网站的每个页面上都有一个功能齐全的表单和表单验证的方法,无论它是堆叠的数据角色页面还是外部数据角色页面,我想保留所有的动画过渡。

【问题讨论】:

  • 我认为我们需要一些源代码来调试它。你用的是什么 jQuery 选择器?
  • 每个页面和表单都应该有一个 jQM 可以访问的唯一 ID
  • 是的,我只是仔细检查了一遍。在我的外部页面上,我没有唯一的 id,但现在我有了。使 ID 唯一似乎并没有改变任何东西。如果这有帮助,当我去mydomain.com/mobile/index.html 时一切正常。当我转到mydomain.com/mobile/otherpage.html 时,一切正常。事情分崩离析的地方是当事情通过 jqmobile 和哈希标记加载到 DOM 中时,比如mydomain.com/mobile/index.html#otherpage.html - 在这个页面上,我在主页上处理表单的 javascript 脚本似乎没有运行,因为我可以看到 p .error 消息。
  • 错误消息是可见的,所以看起来该脚本没有被加载。有没有办法在 jqmobile 加载后调用脚本?我在文档中看到了一些让我认为我可以做到这一点的东西,但文档并不太清楚语法的外观。
  • +1 指出 jQuery Mobile 的缺陷,我在寻找答案时学到了一些东西。

标签: jquery mobile jquery-mobile


【解决方案1】:

让我们从头开始。 原来表单提交默认是 Ajaxified,RTFM here。 而this is how 你可以在 jQuery 中处理它。

由此,我创建了 2 个页面,提交按钮仅提交它所在的表单,这正是您所需要的!

第1页:

<div data-role="page">
    <script type="text/javascript">
        $(document).ready(function () {    
            $("form").submit(function () { // important: form selector, not ID
                if (!confirm("Index submit?"))
                    return false;
            });
        });
    </script>
    <div data-role="header">
        <h1>Main Page</h1>
    </div><!-- /header -->

    <div data-role="content">
        <form id="form1" method="post" action="index.html">
            <p>Page content goes here.</p>
            <input type="submit" value="Submit" class="button" />
            <a href="otherpage.html">Other Page</a>
        </form>
    </div><!-- /content -->

    <div data-role="footer">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page -->

第 2 页:

<div id="page2" data-role="page">
    <script type="text/javascript">
        $(document).ready(function () {
            $("form").submit(function () { // important: form selector, not ID
                if (!confirm("Other page submit?"))
                    return false;
            });
        });
    </script>
    <div data-role="header">
        <h1>Other Page</h1>
    </div><!-- /header -->

    <div data-role="content"> 
        <form id="form2" method="post" action="otherpage.html">  
            <p>Page content goes here.</p>
            <input type="submit" value="Submit" class="button" />
            <a href="index.html">Home Page</a> 
        </form>   
    </div><!-- /content -->

    <div data-role="footer">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page -->

试试这个,如果!IsFromValid() 用你的替换我的!confirm("Other page submit?") 应该很好! 如果它有效,你欠我一品脱,伙计=)

【讨论】:

  • 很棒的伙伴,是的,我今天会尝试一下。我相信该解决方案会起作用,因为当我单击提交按钮时,它将提交成为焦点的表单。在我根据提交按钮的类触发提交之前。我会让你知道,如果它有效,我一定会联系你。感谢您的帮助。
  • 是的,jquery mobile 实际上确实通过 ajax 自动处理表单,但我已经关闭了此功能并编写了自己的脚本,因此我运行了表单验证。我们将看看我的表单验证是否继续妨碍提交表单。希望通过选择表单属性而不是按钮的类,我应该没问题,因为它只会提交一个表单而不是所有表单。
  • 遗憾的是,它仍然与表单验证冲突。每个表单都完全相同,除了我为每个表单分配了唯一的表单 id="form1"、表单 id="form2" 等。所有实际的表单字段都是相同的,因此对于加载的每个页面,表单都在内存中。我想卸载它并重新加载它。
  • 我想,我可以用 javascript 编写整个文件并从 .js 文件中加载它,然后在页面移动时将其卸载并重新加载?
  • 好的,我把我的页面分开了,并在一个更简单的页面中尝试了你的代码。我可以让它工作,但最终我发现的是这篇文章:elijahmanor.com/2011/02/jquery-mobile-form-validation.html,我正在使用 jquery 验证插件来验证表单,只要我不从 index 转到 page2,它似乎就可以工作然后通过链接返回索引,使用 jqm 后退按钮不会混淆它,我可以独立提交两种表单。我明天上午会进一步测试它,但我想我现在可能有一个解决方案。显示!
【解决方案2】:

我想我现在和你在一起。基本上,我设法复制的是一个简单的 jQuery 调用,它在初始 index.html 页面加载时工作,当您离开并返回此页面时停止工作,url 变成类似 index.html#index.html 的东西。

这是由 jQuery mobile AJAXified 页面转换引起的,它有一些提到的限制here(在“已知限制”下),其中之一是:

页面引用的任何唯一资产 在一个 jQuery Mobile 驱动的网站中应该 放置在“页面”元素内 (具有数据角色的元素 “页面”的属性)。例如, 指向样式和脚本的链接 特定于特定页面可以是 在该 div 中引用。

因此,基本上,它的意思是您需要将 JavaScript 移动到 &lt;div data-role="page"&gt;&lt;/div&gt; 中。这对我有用。

【讨论】:

  • 是的,我把它作为我的基本外壳,但你会看到,我详细阐述了我的问题。尝试将相同的表单放在多个页面上并提交该表单。我似乎无法让它工作。
  • 如果有办法在通过 ajax 加载的内部页面上触发一些 javascript,那么我想我可以让它工作。有可能吗?
  • 你能试试我的解决方案吗?
  • 有意思,我试试看。
  • 嗯,好的,所以我将表单验证脚本移至 formval.js。我将脚本放在页面的 div 中。我把表格放在主页和一个内页上。我确保每个表格都有自己唯一的 ID。但是当我按下提交时,表单仍然提交了两种表单(来自主页的一个和来自 page2 的一个,所以我无法在内部页面上提交脚本。问题可能是我用来提交表单的方法。我m 使用 $(".button").click() 提交表单。两个提交按钮上都有“按钮”类。脚本中的多选是否可以在这里工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2023-04-04
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多