jQuery + Ubiquity:从URL返回一个文档对象

时间:2009-05-22 14:39:53

标签: javascript jquery ubiquity

我正在尝试编写一个简单的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. 结果在Wolfram页面上有id="results",我想通过这样的方式得到结果:
    previewBlock.innerHTML = page.getElementById('results').innerHTML
    这怎么可能用我正在使用的网址完成?
  3. 另一种选择可能是使用Wolfram URL作为源创建一个新元素并将其附加到previewBlock - 我不知道如何做到这一点。任何建议将不胜感激。

    更新
    这是我正在使用的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 个答案:

答案 0 :(得分:2)

我认为使用 Ubiquity Preview 甚至无法做到这一点。问题是,当向Wolfram发送请求时,页面会很快完成加载,但它会继续以您已知的方式异步获取其他信息。

如果这是通过浏览器窗口而不是Ubiquity预览完成的,您实际上可以将页面加载到隐藏的iframe中并在更新结果div之前检查内容。但是,此选项在当前版本的Ubiquity中不可用。

这是运行命令并传递“USA GDP”文本的屏幕截图。一旦页面加载完毕,两个div获取显示信息,另外两个div开始异步获取其他数据 alt text http://exterbase.com/wolfram-result.png

答案 1 :(得分:1)

我认为您的想法是可行的,但我认为通过对Wolfram | Alpha API的AJAX调用比尝试解析对W-A Web前端的响应更成功。有关WolframAlpha API的文档,请访问:www.wolframalpha.com/WolframAlphaAPI.pdf

我认为改变与API交互的方法可以解决您的问题。如果您想继续追求当前的方法,您可能需要检查内置Wikipedia命令的代码,以查看它们如何解析搜索结果,然后异步检索预览的文章摘要。