【问题标题】:Jquery mobile is not applying styles when the page is dynamically added动态添加页面时,Jquery mobile 未应用样式
【发布时间】:2013-06-25 16:35:51
【问题描述】:

您好,我有一个使用 JQM 和 Sammy 的小应用程序。我正在使用 Sammy 动态加载页面并附加到我的 index.html 的正文中。问题是我没有看到 JQM 主题被应用,控制台也没有错误。

这有什么原因吗?我确实打电话给以下

 context.render('view/abc.template')
                .appendTo(context.$element(),function(){
                    $(document).ready(function () {
                        $("#container").trigger('pagecreate');
                    });
                });

谢谢

【问题讨论】:

  • 删除 .ready 它不是为 jQM 设计的。将页面附加到 DOM 后,它们将在显示之前得到增强。检查这个例子jsfiddle.net/Palestinian/9jc8Y
  • 感谢 Omar,我进行了更改,现在我可以看到 JQM 样式被应用于第一个模板,但是当我移动到下一页时,它又是一个模板并使用 sammy 呈现样式是没有被渲染。知道可能是什么原因吗?
  • 尝试添加$('[data-role=page').page();$('[data-role=page').trigger('pagecreate');
  • 我在将模板附加到 dom 后添加了它,但没有运气。 JQM 样式仍未得到应用。以下代码供您参考 this.get('#/item', function(context) { context.app.swap(''); context.render('view/page2.template') .appendTo(context.$ element(),function(){ // $(document).ready(function () { // $("#page2").trigger('pagecreate'); // }); }); $('[ data-role="page"]').page(); });
  • 你在哪里追加页面?试试$.mobile.pageContainer.append('your data')

标签: jquery-mobile sammy.js


【解决方案1】:

我就是这样做的;

1) 首先我在一个名为 plugins.js 的文件中禁用了我的 JQM 路由;

$(document).bind("mobileinit", function() {
    /**
    * check out http://coenraets.org/blog/2012/03/using-backbone-js-with-jquery-mobile/  for more details
    */
   $.mobile.ajaxEnabled = false;
   $.mobile.linkBindingEnabled = false;
   $.mobile.hashListeningEnabled = false;
   $.mobile.pushStateEnabled = false;
}); 

这段代码是在我加载 JQM 之前加载的,就像这样;

    <script src="//code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="js/plugins.js"></script>
    <script src="//code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script>
    <script src="js/vendor/sammy/sammy.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/vendor/sammy/plugins/sammy.template.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/main.js"></script>

那么我的main.js函数是这样的;

(function($) {

    var app = $.sammy('#main', function() {
        this.use('Template');

        this.get('#/', function(context) {
            context.load('/templates/index.template', function() {
                $("#container").trigger('pagecreate');
            }).appendTo(context.$element());
        });

        this.get('#/landing', function(context) {
            context.load('/templates/landing.template', function() {
                $("#container").trigger('pagecreate');
            }).replace(context.$element());
        });

    });

    $(function() {
        app.run('#/');
    });
})(jQuery);

我认为您在上面的代码 sn-p 上并不遥远。注意你有你的 $(document).ready 函数作为 appendTo 的回调,它不接受回调。你会看到我的在 load() 中

【讨论】:

  • 谢谢保罗。我可以请你分享你的 index.html 和模板我收到一个错误 Uncaught TypeError: Cannot read property 'options' of undefined with the same code 不知道是什么原因。
  • 登陆模板在这里gist.github.com/sharpred/05969c0d54e491c1af63我只是想和你分享这个项目,但它是给客户的,受保密协议约束
  • 一个想法:你是在加载上面的 sammy.template 插件吗?
  • 感谢 Paul 的回复,我现在可以加载模板,但有两个问题。第一个是页面转换不平滑,即使我已经从第二页添加了页面转换幻灯片,当我回到第一页时,我看到了两个页面的内容,因为如果你看到代码,我们实际上是如果它是第一页,则追加不替换。你遇到过类似的问题吗? Jquery mobile 是否有一些内置设置来实现这一点
  • 嗨,保罗,为迟到的回复道歉。我确实试过了,它奏效了。非常感谢。现在我正在尝试以不同的方式加载模板。现在我们已经在 index.html 中定义了 data-role=page 并动态加载了内容。是否可以将 index.html 保留为空,它只是 head 和 body 标记,并让模板成为 realpage。我尝试这样做的原因是我需要在页面更改时触发一些事件,但我没有看到“pagecreate”事件被触发,因为页面已经创建。再次感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
相关资源
最近更新 更多