Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo fornece regras, limitações e melhores práticas para a API de Caixa de Diálogo do Office, incluindo as melhores práticas para conceber a IU de uma caixa de diálogo e utilizar a API numa aplicação de página única (SPA).
Observação
Para se familiarizar com as noções básicas da utilização da API de Caixa de Diálogo do Office, consulte Utilizar a API de Caixa de Diálogo do Office nos seus Suplementos do Office.
Consulte também Lidar com erros e eventos com a caixa de diálogo do Office.
Regras e limitações
Uma caixa de diálogo só pode navegar para URLs HTTPS e não PARA HTTP.
O URL que transmitir para o método displayDialogAsync tem de estar exatamente no mesmo domínio que o próprio suplemento. Não pode ser um subdomínio. No entanto, a página que transmitir à mesma pode redirecionar para uma página noutro domínio.
Uma página de anfitrião só pode ter uma caixa de diálogo aberta de cada vez. A página do anfitrião pode ser um painel de tarefas ou o ficheiro de função de um comando de função. Pode abrir várias caixas de diálogo ao mesmo tempo a partir de botões do friso personalizados ou itens de menu.
A caixa de diálogo só pode chamar duas APIs do Office:
- Office.context.ui.messageParent
-
Office.context.requirements.isSetSupported(Para obter mais informações, consulte Especificar as aplicações do Office e os requisitos da API.)
Normalmente, chama a função messageParent a partir de uma página no mesmo domínio que o próprio suplemento, mas isto não é obrigatório. Para obter mais informações, mensagens entre domínios para o runtime do host.
Quando é aberta uma caixa de diálogo, está centrada no ecrã na parte superior da aplicação do Office.
O utilizador pode mover e redimensionar uma caixa de diálogo.
É apresentada uma caixa de diálogo pela ordem pela qual é criada.
Dica
No Office na Web e no novo Outlook no Windows, se o domínio da sua caixa de diálogo for diferente do do seu suplemento e impor a Política de Abertura de Origens Cruzadas: cabeçalho de resposta da mesma origem, o seu suplemento será impedido de aceder às mensagens a partir da caixa de diálogo e os seus utilizadores verão o erro 12006. Para evitar este erro, defina o cabeçalho como
Cross-Origin-Opener-Policy: unsafe-noneou configure o suplemento e a caixa de diálogo para estar no mesmo domínio.No Outlook na Web e no novo Outlook no Windows, não defina a propriedade window.name ao configurar uma caixa de diálogo no seu suplemento. Estes clientes do Outlook utilizam a
window.namepropriedade para manter a funcionalidade entre redirecionamentos de página.
Práticas recomendadas
Evitar a substituição de caixas de diálogo
Como a sobreposição de elementos de IU não são recomendáveis, evite abrir uma caixa de diálogo em um painel de tarefas a menos que seu cenário o obrigue a fazer isso. Ao considerar como usar a área de superfície de um painel de tarefas, observe que painéis de tarefas podem ter guias. Para obter um exemplo de um painel de tarefas com separadores, veja o exemplo de JavaScript SalesTracker do Suplemento do Excel .
Criar uma IU da caixa de diálogo
Para obter as melhores práticas na estrutura da caixa de diálogo, consulte Caixas de diálogo nos Suplementos do Office.
Processar bloqueadores de pop-up com Office na Web
Se tentar apresentar uma caixa de diálogo enquanto utiliza Office na Web, o bloqueador de pop-up do browser poderá bloquear a caixa de diálogo. Para evitar este problema, Office na Web pede ao utilizador para Permitir ou Ignorar a abertura da caixa de diálogo.
Se o utilizador selecionar Permitir, a caixa de diálogo do Office é aberta. Se o utilizador escolher Ignorar, o pedido é fechado e a caixa de diálogo do Office não é aberta. Em vez disso, o método devolve o displayDialogAsync erro 12009. O código deve detetar este erro e fornecer uma experiência alternativa que não exija uma caixa de diálogo ou apresentar uma mensagem ao utilizador a avisar que o suplemento requer que o mesmo permita a caixa de diálogo. Para obter mais informações sobre o erro 12009, veja Errors from displayDialogAsync (Erros de displayDialogAsync).
Processar caixas de diálogo bloqueadas (erro 12009)
O seu suplemento deve sempre processar o erro 12009 corretamente. Seguem-se algumas abordagens recomendadas:
Mostrar uma mensagem amigável que explica o motivo pelo qual a caixa de diálogo é necessária.
Office.context.ui.displayDialogAsync( "https://www.contoso.com/auth.html", { height: 60, width: 30 }, (asyncResult) => { if (asyncResult.status === Office.AsyncResultStatus.Failed) { if (asyncResult.error.code === 12009) { // User blocked the dialog. showNotification( "Dialog Required", "This add-in needs to open a dialog to sign you in. " + "Please click the add-in button again and choose 'Allow' when prompted." ); } else { // Handle other errors. showNotification("Error", `Unable to open dialog: ${asyncResult.error.message}`); } } else { // Dialog opened successfully. const dialog = asyncResult.value; // ... Handle dialog events here. } } );Forneça um fluxo de trabalho alternativo sempre que possível. Se o suplemento puder funcionar com capacidades reduzidas quando a caixa de diálogo estiver bloqueada, ofereça essa alternativa ao utilizador.
Desativar o pedido
Se quiser desativar o pedido de permissão/ignorar, o código tem de optar ativamente por não participar. Faça este pedido com o objeto DialogOptions que transmite ao displayDialogAsync método . Especificamente, inclua promptBeforeOpen: false no objeto . Quando define esta opção como falsa, Office na Web não pede ao utilizador para permitir que o suplemento abra uma caixa de diálogo e a caixa de diálogo do Office não é aberta se o bloqueador de pop-up do browser o bloquear.
Observação
A definição promptBeforeOpen: false não é recomendada para a maioria dos cenários. O comportamento predefinido de pedir aos utilizadores fornece uma melhor experiência de utilizador e ajuda os utilizadores a compreender por que motivo a caixa de diálogo é necessária.
Pedir acesso às capacidades do dispositivo no Office na Web e no novo Outlook no Windows
Se o suplemento necessitar de acesso às capacidades do dispositivo de um utilizador, utilize a API de permissão do dispositivo para pedir permissões através de uma caixa de diálogo. As capacidades do dispositivo incluem a câmara, a geolocalização e o microfone de um utilizador. Este requisito aplica-se às seguintes aplicações do Office.
- Office na Web (Excel, Outlook, PowerPoint e Word) em execução em browsers baseados em Chromium, como o Microsoft Edge ou o Google Chrome
- novo Outlook no Windows
Quando o suplemento chama Office.context.devicePermission.requestPermissions ou Office.context.devicePermission.requestPermissionsAsync, é apresentada uma caixa de diálogo com as capacidades do dispositivo pedidas e as opções para Permitir, Permitir uma vez ou Negar acesso. Para obter mais informações, consulte Ver, gerir e instalar suplementos para o Excel, PowerPoint e Word.
Observação
- Os suplementos que são executados em clientes de ambiente de trabalho do Office ou em browsers não baseados em Chromium mostram automaticamente uma caixa de diálogo a pedir a permissão de um utilizador. O programador não precisa de implementar a API de permissão do dispositivo nestas plataformas.
- Os suplementos que são executados no Safari estão impedidos de aceder às capacidades de dispositivo de um utilizador. A API de permissão do dispositivo não é suportada no Safari.
- O acesso à geolocalização de um utilizador só é suportado no Outlook na Web e no novo Outlook no Windows.
Não utilize o valor _host_info
O Office adiciona automaticamente um parâmetro de consulta com o nome _host_info ao URL que é transmitido para displayDialogAsync. Acrescenta este parâmetro após os parâmetros de consulta personalizados, se existirem. Não acrescenta este parâmetro a quaisquer URLs subsequentes para os quais a caixa de diálogo navegue. A Microsoft pode alterar o conteúdo deste valor ou removê-lo totalmente, pelo que o código não deve lê-lo. O mesmo valor é adicionado ao armazenamento de sessão da caixa de diálogo (ou seja, a propriedade Window.sessionStorage ). Mais uma vez, o código não deve ler nem escrever neste valor.
Abrir outra caixa de diálogo imediatamente após fechar uma
Não pode ter mais do que uma caixa de diálogo aberta a partir de uma determinada página de anfitrião, pelo que o código deve chamar a Caixa de Diálogo.fechar numa caixa de diálogo aberta antes de esta chamar displayDialogAsync para abrir outra caixa de diálogo. O close método é assíncrono. Por este motivo, se ligar displayDialogAsync imediatamente após uma chamada de , a primeira caixa de closediálogo poderá não estar completamente fechada quando o Office tentar abrir a segunda. Se isso acontecer, o Office devolve um erro 12007 : "A operação falhou porque este suplemento já tem uma caixa de diálogo ativa."
O close método não aceita um parâmetro de chamada de retorno e não devolve um objeto Promise, pelo que não pode ser aguardado com o await palavra-chave ou com um then método. Por este motivo, utilize a seguinte técnica quando precisar de abrir uma nova caixa de diálogo imediatamente após fechar uma caixa de diálogo: encapsular o código para abrir a nova caixa de diálogo numa função e estruturar a função para se chamar recursivamente se a chamada de displayDialogAsync devoluções 12007. O exemplo seguinte mostra como implementar esta técnica.
function openFirstDialog() {
Office.context.ui.displayDialogAsync(
"https://MyDomain/firstDialog.html",
{ width: 50, height: 50 },
(result) => {
if (result.status === Office.AsyncResultStatus.Succeeded) {
const dialog = result.value;
dialog.close();
openSecondDialog();
}
else {
// Handle errors.
}
}
);
}
function openSecondDialog() {
Office.context.ui.displayDialogAsync(
"https://MyDomain/secondDialog.html",
{ width: 50, height: 50 },
(result) => {
if (result.status === Office.AsyncResultStatus.Failed) {
if (result.error.code === 12007) {
openSecondDialog(); // Recursive call.
}
else {
// Handle other errors.
}
}
}
);
}
Em alternativa, pode forçar o código a colocar em pausa antes de tentar abrir a segunda caixa de diálogo com o método setTimeout . O exemplo seguinte mostra como implementar esta abordagem.
function openFirstDialog() {
Office.context.ui.displayDialogAsync(
"https://MyDomain/firstDialog.html",
{ width: 50, height: 50 },
(result) => {
if (result.status === Office.AsyncResultStatus.Succeeded) {
const dialog = result.value;
dialog.close();
setTimeout(() => {
Office.context.ui.displayDialogAsync(
"https://MyDomain/secondDialog.html",
{ width: 50, height: 50 },
(result) => {
// Callback body.
}
);
}, 1000);
}
else {
// Handle errors.
}
}
);
}
Melhores práticas para utilizar a API de Caixa de Diálogo do Office num SPA
Se o suplemento utilizar o encaminhamento do lado do cliente, como normalmente acontecem as aplicações de página única (SPAs), pode transmitir o URL de uma rota para o método displayDialogAsync em vez do URL de uma página HTML separada. Não utilize esta abordagem pelos motivos indicados na secção seguinte.
Observação
Este artigo não é relevante para o encaminhamento do lado do servidor , como numa aplicação Web baseada no Express.
Problemas com SPAs e a API de Caixa de Diálogo do Office
A caixa de diálogo do Office encontra-se numa nova janela com a sua própria instância do motor JavaScript e, por conseguinte, o seu próprio contexto de execução completo. Se passar uma rota, a sua página base e todo o respetivo código de inicialização e bootstrapping são executados novamente neste novo contexto e todas as variáveis são definidas para os respetivos valores iniciais na caixa de diálogo. Por isso, esta técnica transfere e inicia uma segunda instância da sua aplicação na janela da caixa de diálogo, o que derrota parcialmente o objetivo de um SPA. Além disso, o código que altera variáveis na janela da caixa de diálogo não altera a versão do painel de tarefas das mesmas variáveis. Da mesma forma, a janela da caixa de diálogo tem o seu próprio armazenamento de sessão (a propriedade Window.sessionStorage ), que não é acessível a partir de código no painel de tarefas. A caixa de diálogo e a página de anfitrião na qual displayDialogAsync foi chamada têm o aspeto de dois clientes diferentes para o servidor. (Para um lembrete do que é uma página de anfitrião, consulte Abrir uma caixa de diálogo a partir de uma página de anfitrião.)
Por isso, se passar uma rota para o displayDialogAsync método , não tem realmente um SPA; tem duas instâncias do mesmo SPA. Além disso, grande parte do código na instância do painel de tarefas nunca é utilizado nessa instância e grande parte do código na instância da caixa de diálogo nunca é utilizado nessa instância. É como ter dois SPAs no mesmo pacote.
Recomendações da Microsoft
Em vez de transmitir uma rota do lado do cliente para o displayDialogAsync método , utilize uma das seguintes abordagens.
- Se o código que pretende executar na caixa de diálogo for suficientemente complexo, crie explicitamente dois SPAs diferentes; ou seja, ter dois SPAs em pastas diferentes do mesmo domínio. Um SPA é executado na caixa de diálogo e o outro na página de anfitrião da caixa de diálogo onde
displayDialogAsyncfoi chamado. - Na maioria dos cenários, só é necessária lógica simples na caixa de diálogo. Nestes casos, o seu projeto é bastante simplificado ao alojar uma única página HTML, com JavaScript incorporado ou referenciado, no domínio do spa. Passe a URL da página para o método
displayDialogAsync. Embora esta abordagem signifique que se desvia da ideia literal de uma aplicação de página única, não tem realmente uma única instância de SPA quando utiliza a API de Caixa de Diálogo do Office.