jQuery + Ubiquity: вернуть объект документа из URL - PullRequest
2 голосов
/ 22 мая 2009

Я пытаюсь написать простую команду Ubiquity , которая запустит запрос на Wolfram Alpha и отобразит результаты в объекте предварительного просмотра Ubiquity.

Мне нужно установить innerHTML объекта предварительного просмотра. В настоящее время я делаю это, чтобы получить HTML, который только начало:

//...
jQuery.get( 'http://www.wolframalpha.com/input/?i=' + input.text, 
    null, 
    function( page ) {
        previewBlock.innerHTML = page;
    }
);

У меня есть 2 проблемы / вопросы:

  1. Wolfram требуется 5-10 секунд для генерации всего HTML-кода на странице, поэтому команда get() возвращает неполный HTML-код
    Как можно ожидать полной загрузки страницы?

  2. Результаты имеют id="results" на странице Wolfram, я хотел бы просто получить результаты, выполнив что-то вроде этого:
    previewBlock.innerHTML = page.getElementById('results').innerHTML
    Как это можно сделать с помощью URL I пользуюсь?

Другим вариантом может быть создание нового элемента с использованием URL-адреса Wolfram в качестве источника и добавление его к previewBlock - хотя я не уверен, как это сделать. Любые предложения будут оценены.

UPDATE
Вот скрипт Ubiquity, который я использую - он извлекает изображения из исходного HTML и выводит их в цикле. Примечание: CmdUtils.previewGet(pblock, opt) звонки jQuery.get(opt)

CmdUtils.CreateCommand({
  name: "wolfram",
  takes: {"input": noun_arb_text},
  icon: "http://www.wolframalpha.com/favicon.ico",
  homepage: "http://www.wolframalpha.com",
  author: {name:"Jason Coon"},
  description: "Searches Wolfram Alpha and loads results in to Preview pane.",

  preview: function(pblock, input) {
    CmdUtils.previewGet(pblock,
      'http://www.wolframalpha.com/input/?i=' + input.text,
      null,
      function(data){
        var resultStart = data.indexOf("results",0);
        var beginPos = data.indexOf("<img src", resultStart);
        var endPos = 0;
        var html = ""
        while(beginPos != -1){
          endPos = data.indexOf(">", beginPos);
          html = html + "<br><br>" + data.substring(beginPos, endPos);
          beginPos = data.indexOf("<img src", endPos);
        }
        pblock.innerHTML = html;
      }
    );
  }
})

Ответы [ 2 ]

2 голосов
/ 23 мая 2009

Я не думаю, что это возможно даже при использовании Ubiquity Preview . Проблема в том, что при отправке запроса в Wolfram страница очень быстро завершает загрузку, но продолжает получать дополнительную информацию асинхронно, как вы уже знаете.

Если бы это было сделано через окно браузера вместо предварительного просмотра Ubiquity, вы могли бы фактически загрузить страницу в скрытый iframe и проверить содержимое перед обновлением div результатов. Однако эта опция недоступна в текущей версии Ubiquity.

Вот скриншот запуска вашей команды и передачи текста "ВВП США". Два элемента div получают информацию об отображении, а еще два начинают асинхронную загрузку дополнительных данных, как только загрузка страницы завершится.
альтернативный текст http://exterbase.com/wolfram-result.png

1 голос
/ 25 мая 2009

Я думаю, что ваша идея выполнима, но я думаю, что вы получите больший успех при вызове AJAX в Wolfram | Alpha API, чем при попытке разобрать ответ на веб-интерфейс W-A. Документацию по API WolframAlpha смотрите здесь: www.wolframalpha.com/WolframAlphaAPI.pdf

Я думаю, что изменение вашего подхода к взаимодействию с API должно решить ваши проблемы. Если вы хотите продолжить следовать своему текущему подходу, вы можете изучить код встроенной команды Википедии, чтобы увидеть, как они анализируют результаты поиска, а затем асинхронно извлекать резюме статей для предварительного просмотра.

...