Веб-надстройка Office.js WORD: метод window.open () не работает с URL-адресом about: blank - PullRequest
0 голосов
/ 28 октября 2018

Сводка :

window.Open('') или window.Open('about:blank') работает с JavaScript в обычном HTML-файле, что можно проверить здесь .Но, похоже, он не работает в надстройке Office.js.

Подробности :

На моем Windows 10 desktop с VS2017 я создал этот проект надстройки Office.js WORD, который отлично работает с моей Microsoft Office Home and Student 2016 редакцией.В этом же проекте я создал новую кнопку btnTest в файле home.js.Когда я нажимаю btnTest, он успешно вызывает следующий метод MyTest и открывает новое окно с window.Open('some URL').

Но в том же методе MyTest, когда я вызываю window.Open('about:blank'), он не открывает пустая страница ;вместо этого он открывает окно сообщения Windows 10, показанное на снимке экрана ниже.

Цель здесь в том, чтобы мой код создал строку HTML на основе некоторого содержимого из WORD document, а затем использовал метод window.document.write(...) для динамического открытия этого HTML-кода вбраузер как объяснено (и вы можете проверить) здесь . Вопрос : Как я могу заставить работать метод window.Open('about:blank')?

function MyTest() {
        Word.run(function (context) {

            // window.open('https://www.google.com/'); this works
            var myWindow = window.open('about:blank'); //this does not work and, instead, displays the default Windows 10 message shown in screenshot below
            myWindow.document.write('<!DOCTYPE html><html><head></head><body><p>This is just a paragraph</p></body></html>');


            // Synchronize the document state by executing the queued commands,
            // and return a promise to indicate task completion.
            return context.sync().then(function () {
                //following (after un-commenting) does not work either
                //var myWindow = window.open('about:blank');
                //myWindow.document.write('<!DOCTYPE html><html><head></head><body><p>This is just a paragraph</p></body></html>');
            });
        })
            .catch(function (error) {
                console.log('Error: ' + JSON.stringify(error));
                if (error instanceof OfficeExtension.Error) {
                    console.log('Debug info: ' + JSON.stringify(error.debugInfo));
                }
            });
    }

Окно следующего сообщения Windows выскакивает, а кнопка ОК становится серой при вызове window.open('about:blank');:

enter image description here

ПРИМЕЧАНИЕ : На том же рабочем столе я создал новый этот UWP AP with Javascript проекти в следующем методе их проекта я откомментировал их код и добавил window.open('about:blank');.Когда я вызываю следующий метод там, он успешно открывает пустую страницу по умолчанию.

function sayHello() {
    //var messageDialog = new Windows.UI.Popups.MessageDialog("Hello, world!", "Alert");
    //messageDialog.showAsync();
    window.open('about:blank');
}

ОБНОВЛЕНИЕ :

Как я могу заставить его работать из диалога?Я попробовал следующее, но это не сработало: я создал эту диалоговую надстройку .Работает как есть.Затем я закомментировал код функции submit() в файле Form.js надстройки в новом проекте и добавил вместо него строку window.open('https://www.google.com/');.Когда я нажимаю кнопку «Отправить» в диалоговом окне, он успешно открывает веб-сайт Google в браузере по умолчанию.Но если я заменим вышеуказанную строку на

var myWindow = window.open('about:blank');
myWindow.document.write('html here'');`

, то появится то же окно с предупреждением, показанное на рисунке выше

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019
import {POP_UP_HEIGHT, POP_UP_WIDTH} from '../constants';

/**
 * Handles interaction with the Office API for Common shared API.
 */
export default class Office {
  constructor(office) {
    this.office = office;
    this.dialog = null;
    this.callback = null;
  }

  /**
   * Store the callback function that will be invoked to
   * after pop-up message is received.
   * @param {string} url
   * @param {function} callback
   */
  openPopUp(url, callback) {
    this.callback = callback;
    this.office.context.ui.displayDialogAsync(url,
      {height: POP_UP_HEIGHT, width: POP_UP_WIDTH}, this.dialogCallback.bind(this)); // THIS IS WHAT YOU NEED
  }

  /**
  * Send the message from the child window (pop-up window)
  * To the parent window (Task pane window)
  * @param {string} message
  */
  messageFromPopUp(message) {
    this.office.context.ui.messageParent(message);
  }

  /**
   * The parent window will close the child window (pop-up)
   * and invoke the callback functionality
   * with a given message from the child window
   * @param {Object} event
   */
  dialogHandler(event) {
    this.dialog.close();
    this.callback(event.message);
  }

  /**
   * Store the child window (pop-up window) and create
   * an event handler to notify the parent window when
   * the child window sends a message to it
   * @param {Object} asyncResults
   * @param {string} asyncResults.status Status of the result, preferably 'succeeded'
   * @param {string} asyncResults.value
   */
  dialogCallback(asyncResults) {
    if (asyncResults.status === 'succeeded') {
      this.dialog = asyncResults.value;
      this.dialog.addEventHandler(this.office.EventType.DialogMessageReceived,
        this.dialogHandler.bind(this));
    }
    else {
      console.error(`Error: ${asyncResults.error.message}`);
    }
  }
}
0 голосов
/ 08 ноября 2018

Мы блокируем эти вызовы на уровне песочницы, я настоятельно рекомендую вам использовать API ShowDialog, как предлагается здесь Существует ли какой-либо API Office.js для получения ввода пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...