鍍金池/ 問答/HTML/ js的WebSocket的onmessage方法遇到jquery的奇怪現(xiàn)象

js的WebSocket的onmessage方法遇到jquery的奇怪現(xiàn)象

目的是不斷讀取后臺tomcat的日志,為了性能,jquery對象提早用全局變量記錄好了。
但是發(fā)覺在onmessage方法里,操作該對象,F(xiàn)12調(diào)試里看到div的html內(nèi)容都正常,但是界面沒有實際效果。
非要直接寫jquery對象才可以,用不了全局的定義。

請大伙直接看注釋部分↓

<div id="app">
    <div id="log-container" style="height: 650px; overflow-y: scroll; background: #333; color: #aaa; padding: 10px;">
        <div>
        </div>
    </div>
</div>
<script>
    let a=1;
    let $div = $("#log-container div").eq(0);
    let $container = $("#log-container");
    let vm = new Vue({
        el: '#app',
        data: {
            ws: null,
            webHost: window.location.host
        },
        created() {
            this.ws = new WebSocket('ws://' + this.webHost + '/log');
            $div.append('1'); // 成功
            this.ws.onmessage = function (event) {
                ++a; // 成功
                $div.html(a); // 無效果
                $container.scrollTop($div.height() - $container.height()); // 成功
            };

            this.ws.onerror = function (evt) {
                alert("出錯啦");
            };
        },
        methods: {}
    });
</script>
回答
編輯回答
舊顏

vue使用的是虛擬dom,你給div賦值的時候,真實dom是生效的,到?jīng)]有作用到vue的虛擬dom上,然后虛擬dom重繪dom的時候自然就沒了

你可以使用this.$nextTick(),原理自己百度下

2017年4月12日 01:24
編輯回答
大濕胸

次序是這樣的。先獲取了$div,$container
然后new Vue->$app.html('') 然后$div和$containner就變成了已經(jīng)銷毀或者說游離的dom元素了。你再去設置就已經(jīng)不在body里面了。
所以你需要重新獲取。這個時機當然就是在新的dom被掛在在$app的時候。

是不是因為vue重寫了#app里面的dom元素。你之前取的div和之后的不是一個div。寫個mounted方法試試就知道了
看樣子是沒聽懂。代碼給你改下

<div id="app">
    <div id="log-container" style="height: 650px; overflow-y: scroll; background: #333; color: #aaa; padding: 10px;">
        <div>
        </div>
    </div>
</div>
<script>
    let a=1;
    let $div = $("#log-container div").eq(0);
    let $container = $("#log-container");
    $div[0].x = 1
    $container[0].x = 1
    console.log($div[0].x, $container[0].x);
    /*
        掛載前后dom不相同
    */
    let vm = new Vue({
        el: '#app',
        data: {
            ws: null,
            webHost: window.location.host
        },
        mounted() {
            $div = $("#log-container div").eq(0);
            $container = $("#log-container");
            console.log($div[0].x, $container[0].x);
            this.ws = new WebSocket('ws://' + this.webHost + '/log');
            $div.append('1'); // 成功
            this.ws.onmessage = function (event) {
                ++a; // 成功
                $div.html(a); // 無效果
                $container.scrollTop($div.height() - $container.height()); // 成功
            };

            this.ws.onerror = function (evt) {
                alert("出錯啦");
            };
        },
        created() {
        },
        methods: {}
    });
</script>
2017年8月18日 05:52
編輯回答
拼未來

能用vue的就不用直接操作dom了

<div id="log-container" style="height: 650px; overflow-y: scroll; background: #333; color: #aaa; padding: 10px;">
{{a}}
        <div>
2018年3月5日 07:45