1

私たちの組織では、一部のサードパーティ製アプリケーションとの互換性のために、IE9 を IE7 レンダリング モードに移行するポリシーをすべてのユーザーに適用しています。SignalR と KnockoutJS を使用する新しいアプリケーションに取り組んでおり、使用して IE を IE9 モードに強制しています。

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />

しかし、何らかの理由で IE が切り替わらないのですか? 開発者ツールにアクセスすると、アプリが IE9 モードでレンダリングされていることが示されますが、実際には正しく動作しません。開発者ツールを開かずに IE を更新すると壊れますが、開発者ツールを開いて IE を更新すると、アプリが動作し始めます。また、手動で IE9 レンダリング モードに切り替えると、問題も修正されます。問題は、多くのユーザーがいるため、全員に対して手動でこれを行うのは現実的ではないことです。

正確な問題は、init だけが機能していないように見えることです。このめちゃくちゃな状態でも、IE は、ページが最初にロードされたときに、他のすべてのクライアントにメッセージを投稿できます。アプリケーションは、Firefox と Chrome で問題なく動作します。

X-UA-Compatible タグも web.config に含めましたが、役に立ちませんでした。私は SignalR と KnockoutJS を初めて使用するので、何か見逃していることがありますか?

<script>
    $(function () {

        function Post(message, author, postedDate) {
            this.message = ko.observable(message);
            this.author = ko.observable(author);
            this.postedDate = ko.observable(postedDate);
            this.postedDateText = ko.observable("");
        }

        function PostsViewModel() {
            this.hub = $.connection.messageHub;
            this.posts = ko.observableArray([]);
            this.msg = ko.observable("");
            this.lengthRemaining = ko.observable(1000);

            this.canPost = ko.computed(function () {
                return this.msg().length > 0 && this.msg().length <= 1000;
            }, this);

            if (ko && ko.bindingHandlers) {
                ko.bindingHandlers['jEnable'] = {
                    'update': function (element, valueAccessor) {
                        var value = ko.utils.unwrapObservable(valueAccessor());
                        var $element = $(element);
                        $element.prop("disabled", !value);

                        if ($element.hasClass("ui-button")) {
                            $element.button("option", "disabled", !value);
                        }
                    }
                };
            }

            this.msg.subscribe(function (newValue) {
                this.lengthRemaining(1000 - newValue.length);
            }, this);

            this.updateTime = function () {
                for (var i = 0; i < this.posts().length; i++) {
                    console.log(this.posts()[i].postedDate());
                    var date = new Date(this.posts()[i].postedDate());
                    var curDate = new Date();
                    var diff = curDate - date;

                    if (diff < 60000) {
                        this.posts()[i].postedDateText("Less than a minute ago");
                    } else if (diff >= 60000 && diff < 120000) {
                        this.posts()[i].postedDateText(Math.round(diff / 60000).toString() + " minute ago");
                    } else if (diff >= 120000 && diff < 3600000) {
                        this.posts()[i].postedDateText(Math.round(diff / 60000).toString() + " minutes ago");
                    } else if (diff >= 3600000 && diff < 7200000) {
                        this.posts()[i].postedDateText("one hour ago");
                    } else if (diff >= 7200000 && diff < 86400000) {
                        this.posts()[i].postedDateText(Math.round(diff / 3600000).toString() + " hours ago");
                    } else {
                        var month = date.getMonth() + 1;
                        var day = date.getDate();
                        var year = date.getFullYear();
                        this.posts()[i].postedDateText(year + "/" + month + "/" + day);
                    }
                }                    
            };

            this.sendPost = function () {
                this.hub.server.send(this.msg(), "@User.Identity.Name.Replace(@"ACCOUNTS\","")");
                this.msg("");
                $("#dialog").dialog("close");
            };

            this.cancelPost = function () {
                $("#dialog").dialog("close");
                this.msg("");
            };

            this.init = function () {
                console.log("init");
                this.hub.server.getMessages();
                window.setInterval(function () { postsViewModel.updateTime(); }, 30000);
            };

            this.hub.client.populateMessages = function (postsArray) {
                console.log("populate posts");
                var postsCollection = $.map(postsArray, function (post) {
                    return new Post(post.message, post.author, post.postedDate);
                });

                postsCollection.forEach(function (post) {
                    postsViewModel.posts.push(post);
                });

                postsViewModel.updateTime();
            };

            this.hub.client.updateMessage = function (post) {
                console.log("received a post");
                postsViewModel.posts.unshift(new Post(post.message, post.author, post.postedDate));
                postsViewModel.updateTime();
            };
        };

        var postsViewModel = new PostsViewModel();
        ko.applyBindings(postsViewModel);

        $.connection.hub.start().done(function () {
            console.log("started!");
            postsViewModel.init();
        }).fail(function () {
            console.log("Could not connect!");
        });

        $("#newpost-button").button().click(function () {
            $("#dialog").dialog("open");
        });

        $("#cancel-button").button();
        $("#post-button").button();

        $("#dialog").dialog({
            autoOpen: false,
            height: 256,
            width: 543,
            modal: true,
            close: function () {
                postsViewModel.cancelPost();
            }
        });
    });
</script>

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

1

@Lukasz start()コードを以下のように変更するとどうなりますか?

$.connection.hub.start().done(function () {
console.log("started!");
$.connection.messageHub.server.getMessages();

    }).fail(function () {
        console.log("Could not connect!");
    });
于 2013-03-22T17:34:46.153 に答える
0

この特定の状況では、console.log("") 行が IE7 レンダリング モードで IE9 をチョークし、強制的に IE9 モードに戻され、それ以降の行は呼び出されません。コードから console.log 行を削除すると、問題が修正されました。

于 2013-03-22T19:05:57.910 に答える