如何在单页应用程序 (SPA) 的特定页面中隐藏对讲聊天小部件?

Posted

技术标签:

【中文标题】如何在单页应用程序 (SPA) 的特定页面中隐藏对讲聊天小部件?【英文标题】:How to hide the Intercom chat widget in specific pages in a single page application (SPA)? 【发布时间】:2019-12-14 18:08:51 【问题描述】:

考虑用 vanilla JS 编写的单页应用程序(以避免特定于框架的答案)。

我有一个应用程序,默认情况下会在其中加载对讲机,但我想在特定页面中隐藏小部件。

这应该可以从 Intercom 本身实现,如他们帮助中心的this article 所示,但它在单页应用程序中实际上不起作用 - 无论在 Intercom 中配置什么,都会显示小部件。

一种选择是在页面上找到小部件并为给定页面手动隐藏它,但这感觉、听起来和味道都像 hack(它需要在返回到应该有小部件的页面时重新启用小部件出现)。

那么,对于如何为 SPA 做这件事,有什么好的做法吗?

【问题讨论】:

您可以在进入给定页面时有条件地将CSS类添加到BODY,并在退出给定页面时删除该类。然后您可以使用 CSS 选择器定位 Intercom 小部件并将其设为 display: none @IVOGELOV 这就是我所说的感觉像是黑客的东西。使用 CSS 选择器而不是 js 并不能让它变得更好。 【参考方案1】:

如果您想以编程方式隐藏对讲机启动器,可以使用update 命令来实现。

隐藏:

Intercom('update', 
  "hide_default_launcher": true
);

并再次显示它(当您的下一页加载或触发应该显示它的事件时)。

Intercom('update', 
  "hide_default_launcher": false
);

我在有角度的 SPA 中使用了这种精确的技术,将其隐藏在屏幕上,它会遮挡一些按钮。

【讨论】:

提示:在尝试访问窗口对象("Intercom" in window)之前,值得检查窗口对象上是否存在Intercom,因为某些用户的浏览器扩展程序会阻止对讲脚本被下载。执行此检查将在运行时为您节省一个错误。 完整的脚本是什么? @OldGreg if (window.Intercom) window.Intercom('upda...if (typeof window.Intercom !== 'undefined') ...【参考方案2】:
Intercom('update', 
     "hide_default_launcher": true
);
$(".helpSupport").once().on("click", function() 
     Intercom('update', 
        "hide_default_launcher": false
     );
      Intercom('showMessages');
);

【讨论】:

【参考方案3】:

当我调用我的组件时,我调用了这段代码。

window.Intercom('update', 
    hide_default_launcher: false,
  );

示例:

const MyComponent = () => 
     window.Intercom('update', 
        hide_default_launcher: false,
      );

  return (
<div>...</div>);
;

缺点是您必须将 hide_default_launcher 设置为 true,当您希望小部件下次出现时.

【讨论】:

【参考方案4】:

在您加载用户数据时输入此代码,并将您的小部件可见性设置为默认值

// Intercom logged in user variables loader
(<any>window).Intercom("boot", 
    app_id: "abc",
    name: user.username,
    email: user.email,
    created_at: moment(user.addedDate).unix()
  );

// Hide messenger widget after loading user variables
// Will show it manually in specific pages
if ((<any>window).Intercom) (<any>window).Intercom("update", 
     "hide_default_launcher": true
);

将此代码添加到您的警卫或导航器中,以根据您的默认设置在所有页面中显示/隐藏它

// Hide messenger widget for all pages by default
// Will show it manually in specific pages
if ((<any>window).Intercom) (<any>window).Intercom("update", 
     "hide_default_launcher": true
);

然后在特定页面中显示/隐藏它

ngOnInit()

    // Show messenger widget for current page
    // This code will override the default one in auth-guard/navigator
    if ((<any>window).Intercom) (<any>window).Intercom("update", 
     "hide_default_launcher": false
    );

如果需要查看所有启动/更新属性,请使用此链接 https://developers.intercom.com/installing-intercom/docs/javascript-api-attributes-objects

【讨论】:

【参考方案5】:

您可以根据当前页面网址在对讲机设置中包含/排除页面,这适用于我们的 SPA。说明位于您在问题中链接到的article 中,位于“显示 Messenger 启动器以选择网站访问者”下。

转到 Messenger 设置 > 控制您的入站对话音量 选择“符合特定数据的访客” 选择“添加数据”并添加属性“当前页面 URL”以定义您希望/不希望显示对讲机启动器的页面

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

以上是关于如何在单页应用程序 (SPA) 的特定页面中隐藏对讲聊天小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单页应用程序 (SPA) 中实现 ReCaptcha

Web API 2 入门——使用ASP.NET Web API和Angular.js构建单页应用程序(SPA)(谷歌翻译)

SPA单页应用

在单页应用程序中,当在 VueJs 中输入新数据时,如何在不重新加载页面的情况下重新加载 api [关闭]

如何在单页应用(spring security)中提供 CSRF Token?

Vue - 路由