javascript - Chrome 在 Ajax 同步调用之前不显示 Jquery 的动态 css 属性更改

标签 javascript css ajax google-chrome

我在使用 Google Chrome 浏览器时遇到了一个棘手的问题。

我有以下 HTML 节点:

<div class="result-req-chat pointer float-right" onclick="chat.addUser(this/*, other vars*/)" ><img src="/images/profile_icon_4.png" alt="" /></div>

点击事件触发聊天对象的方法

    this.addUser = function(trigger_node, id, is_silent, session, show_block_message){
    if(trigger_node){
        this.bk_trigger_node.html = trigger_node.innerHTML;
        this.bk_trigger_node.cn = trigger_node.className;
        trigger_node.innerHTML = '';

        jQuery(trigger_node).addClass("loader");
        jQuery(trigger_node).removeClass("bpurple");
        jQuery(trigger_node).removeClass("bgray");
        jQuery(trigger_node).removeClass("button");
    }
    //alert('if this is executed then it displays the previous changes of the node');
    if(trigger_node.innerHTML == ''){
        this.addUserToChat(id, is_silent, session, show_block_message);
    }
    if(trigger_node){
        trigger_node.innerHTML = this.bk_trigger_node.html;
        trigger_node.className =this.bk_trigger_node.cn;
    }
}

addUserToChat() :

    this.addUserToChat = function (id, is_silent, session, show_block_message){
    var response = this.chat_tabs.addTab(id, null);
    if(response.error){
        callUrl("/me/chat/remove-session/id/"+id);
        this.chat_tabs.removeTab(id);
        if(show_block_message) alert(response.message);
    }else{

        this.createTabsBar();
        if(!is_silent){
            this.switchTab(id);
            this.resetContainer(is_silent);
        }
        if(id == this.chat_tabs.active_tab){
            this.active_chat_obj.refresh(session);
        }

        if(this.closed){
            if(this.stop_check){
                return;
            }
            this.resetContainer();
            this.switchTab(id);
        }

    callUrl("/me/chat/add-session/id/"+id);
    }
}

chat_tabs.addTab():

    // creates and adds the a tab
this.addTab = function(id,name,user_data,session){
    var exists = this.getTab(id);
    if(!exists){

        if(session){
            var user_session_id = session.id;
            var user_session_data = session.data;
        }else{
            var session = this.createSession(id);
            if(session.error){
                return session;
            }
            var user_session_id = session.id;
            var user_session_data = session.data;
        }
        if(name){
            var user_name = name;
        }else{
            var user_name = this.getName(id);
        }
        if(user_data){
            var user_data = user_data;
        }else{
            var user_data = this.getData(id);
        }

        var ob = new Object({
            user_id: id,
            user_name: user_name,
            user_data: user_data,
            user_session_id: user_session_id,
            user_session_data: user_session_data,
            has_new:false,
            chat_screen: new ChatScreen(session, id, user_name, user_data, this.main_user_id, this.main_user_photo)
            });

        this.chat_users.push(ob);
        return ob;
    }else{
        return exists;
    }
}

callUrl():

    function getUrl(url){
return jQuery.ajax({ type: 'GET', url: url, async: false }).responseText;

重点是方法addUserToChat()包含同步 Ajax 调用。

Chrome 的问题在于 trigger_node不显示更改。如果您使用内置的 JS 调试器观看,那么一切正常(即使显示)。此外,如果您取消注释警报。

它在 Mozilla(最新版本)上运行。此外,Crome 也是最新版本。 我可以观察到,在等待 ajax 响应期间,页面对悬停、提示等事件没有响应。

您对此有什么建议吗?如何实现变通方法?

最佳答案

同步 Ajax 调用是不好的做法!他们会在整个过程中停止浏览器,并让用户误以为发生了崩溃。你真的应该改变这一点。

关于您为什么看不到最新的 DOM 更改的问题:

当您在 JavaScript 中更改某些内容时,浏览器不会立即更改 DOM,因为绘制一个 ui 元素比绘制一打要昂贵得多。因此,现代浏览器将尝试尽可能惰性地更改 DOM。

除了性能之外,还有其他优点,例如

$('p').hide();

可以同时隐藏所有 p 元素,尽管 jQuery 会选择每个元素然后更改 css。

如果不更好地理解您的代码,我无法给您任何解决方法,抱歉。谢谢!

更新:

阅读您的代码后,我会考虑向应用程序添加一些闭包。 javascript 的一个基本概念是函数是第一类类型。我个人认为,您的程序流程不太理想,这是需要改进的地方。调用 url 的调用应如下所示:

var callUrl = function(url, callback, interactionStoped) {
   if(typeof interactionStoped != 'undefined' && interactionStoped == true) {
       //add code to display some loading animation
   }

   jQuery.ajax({ type: 'GET', url: url, success: function(data) {
       callback(data);
       //remove loading animation here
   } });
}

作为开始。然后重构 getUrl 调用。

  • 有趣的是在您的代码示例中您从不使用响应,所以我不知道您的应用程序在等待什么。假设这是重要的事情,您必须始终在回调中处理响应。
  • 尝试将您的应用视为一棵树。父函数或对象将调用自己一些处理不同任务的子函数,它们自己将调用其他函数。构建小的方法,并且只对非常小的一组数据/参数做一件事。

我无法重写您的完整代码,但无论如何我希望这对您有所帮助。

关于javascript - Chrome 在 Ajax 同步调用之前不显示 Jquery 的动态 css 属性更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7847661/

相关文章:

javascript - 内部 html 单选按钮数组值被写入 for 循环

javascript - 错误: Can't set headers after they are sent

javascript - 使用 jQuery 使 div 水平滚动

javascript - JQuery悬停切换相关选择器

javascript - Chrome 扩展程序内容脚本未加载

javascript - 取消弹出编辑窗口后,Kendo Grid 列模板取消初始化

javascript - 如何使用 ajax.get 调用从 node.js 服务器获取响应

javascript - 在JQUERY中如何发现一个页面中的所有ajax调用都已经完成?

android - 在 Android web 应用程序中实现 coverflow UI

php - 存储和检索位置字段的最佳方式