流星撞击Safari

时间:2014-08-08 00:40:57

标签: javascript safari meteor iron-router

我在流星应用程序中遇到了一个令人难以置信的荒谬错误。基本上,我有一个特定的页面,它会渲染一些模板,在Mac上崩溃Safari,而且只有Safari(并且只有当控制台未打开时)。

我已经(稍微)将其缩小到一个似乎有助于解决问题的场景。删除下面列出的'floorList'模板上的事件处理。任何想法,问题和建议都会非常感激。

我知道很难说没有看到所有内容,但这里大致是设置:

我们正在使用铁路由器,主模板加载:

<template name="layout">
    <div id="pageWrap">
        {{> yield}}
    </div>
</template>

我们的“收益率”是一个模板:

<template name="pageList">
    <div class="pages">
        {{#each pageWithRank}}
            {{> pageItem}}
        {{/each}}
    </div>
</template>

'pageItem'模板已加载(限制为返回10个项目)

<template name="pageItem">
    <div class="page">
      ...
    </div>
</template>

以及包含帮助程序和事件处理程序的“pageItem”js文件,例如:

Template.pageItem.helpers({
    ...
});

Template.pageItem.events({
    'click .shareable': function(e, template) {
        ...
    },
    'click .share': function(e, template) {
        ...
    },
    'click .removePage': function(e) {
        ...
    }
});

路由器配置:

var preloadSubscriptions = [];
preloadSubscriptions.push('notifications');
preloadSubscriptions.push('alerts');
preloadSubscriptions.push('myPages');

var mainYieldTemplates = {
    'footer': { to: 'footer' },
    'header': {to: 'header'}
};


Router.configure({
    layoutTemplate: 'layout',
    loadingTemplate: 'loading',
    yieldTemplates: mainYieldTemplates, 
    waitOn: function() {
        return _.map(preloadSubscriptions, function(sub) {
            if (typeof sub === 'object') {
                Meteor.subscribe(sub.subName, sub.subArguments);
            } else {
                Meteor.subscribe(sub);
            }
        });
    }
});

var coreSubscriptions = new SubsManager({
    cacheLimit: 10,
    expireIn: 1
});

pagesListController = RouteController.extend({
    template: 'pageList',
    increment: 10,
    limit: function() {
        return parseInt(this.params.pageLimit) || this.increment;
    },
    findOptions: function() {
        return {
            sort: this.sort,
            limit: this.limit()
        };
    },
    pages: function() {
        return Pages.find({}, this.findOptions());
    },
    data: function() {
        var hasMore = this.pages().count() === this.limit();
        return {
            pages: this.pages(),
            nextPath: hasMore ? this.nextPath() : null
        };
    },
    onBeforeAction: function() {
        return [
            coreSubscriptions.subscribe('pages', this.findOptions()),
            coreSubscriptions.subscribe('pagesListUsers', this.findOptions())
        ];
    }
});

我们目前在项目模板上使用了6个点击事件。即使它们是空白的,Safari也会崩溃,完全删除,Safari也没问题。

我是疯了还是做了一些非常错误的逻辑?

编辑:这听起来也很疯狂但是...通过将div中的模板包装在div中似乎解决了问题。为什么会这样?

{{#each pageWithRank}}
  <div>
    {{> pageItem}}
  </div>
{{/each}}

1 个答案:

答案 0 :(得分:2)

对于Meteor而言,这似乎不是一个问题,因为它与Safari网络浏览器一样,从个人经验和Safari中的这个问题进行测试。 查看日志和高级调试功能并考虑到问题主要仅存在于Safari和某些情况下IE9中,这是浏览器尝试将传输的数据呈现到页面的方式的问题。

在IE9的情况下,通常只有在未包含html5填充程序时才会发现此错误,并且错误是由于IE9缺少Web而无法正确呈现和解释数据的结果-kit和html5兼容性,如果包含垫片,则通常是IE9兼容模式设置。

在Safari的情况下,问题类似,但不一样,Safari本机支持html5以及web-kit样式格式 这里的问题是Safari中的一个错误,它处理数据的方式,你实际上给它一个项目列表,但它无法连续附加到主div,通过将其封装在自己的子div中,你给它一个更好的要使用的命名空间以及更清晰的渲染位置,我不知道这是苹果内部安全设置的结果还是只是一般渲染错误,但问题的确存在于Safari而不是Meteor