jQuery + 普遍性:从 URL 返回文档对象
我正在尝试编写一个简单的 Ubiquity 命令,该命令将在 Wolfram Alpha,并在 Ubiquity 预览对象中显示结果。
我需要设置预览对象的 innerHTML
。 我目前正在这样做是为了获取 HTML,这只是一个开始:
//...
jQuery.get( 'http://www.wolframalpha.com/input/?i=' + input.text,
null,
function( page ) {
previewBlock.innerHTML = page;
}
);
我有 2 个问题:
- Wolfram 需要 5-10 秒才能生成页面上的所有 HTML,因此
get()
命令返回不完整的 HTML
如何等待页面完全加载? - 结果在 Wolfram 页面上有
id="results"
,我想通过执行以下操作来获取结果:previewBlock.innerHTML = page.getElementById('results').innerHTML
这怎么可能完成了我正在使用的 URL?
另一种选择可能是使用 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;
}
);
}
})
I'm trying to write a simple Ubiquity command that will run a query on Wolfram Alpha, and display the results in the Ubiquity preview object.
I need to set the innerHTML
of the preview object. I am currently doing this to get the HTML, which is only a start:
//...
jQuery.get( 'http://www.wolframalpha.com/input/?i=' + input.text,
null,
function( page ) {
previewBlock.innerHTML = page;
}
);
I have 2 problems/questions:
- Wolfram takes 5-10 sec to generate all the HTML on the page, so the
get()
command returns incomplete HTML
How can it wait for the page to load completely? - The results have
id="results"
on the Wolfram page, I'd like to just get the results by doing something like this:previewBlock.innerHTML = page.getElementById('results').innerHTML
How can this be done with the URL I'm using?
Another option might be to create a new element using the Wolfram URL as source and append it to previewBlock
-- I'm not sure how to do that though. Any suggestions would be appreciated.
UPDATE
Here is the Ubiquity script I'm using -- It will fetch the images from the source HTML and output them in a loop. Note: CmdUtils.previewGet(pblock, opt)
calls 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;
}
);
}
})
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为使用Ubiquity Preview 甚至不可能实现这一点。 问题是,当向 Wolfram 发送请求时,页面很快就会完成加载,但正如您所知,它会继续异步获取其他信息。
如果这是通过浏览器窗口而不是 Ubiquity 预览完成的,您实际上可以将页面加载到隐藏的 iframe 中,并在更新结果 div 之前检查内容。 但是,此选项在当前版本的 Ubiquity 中不可用。
这是运行命令并传递文本“USA GDP”的屏幕截图。 页面加载完成后,两个 div 获取显示信息,另外 2 个 div 开始异步获取其他数据。
替代文本 http://exterbase.com/wolfram-result.png
I don't think this is even possible using the Ubiquity Preview. The problem is that when sending the request to Wolfram, the page finishes loading very quickly, but it continues to fetch additional information asynchronously as you already know.
If this was done through a browser window instead of the Ubiquity preview, you could actually load the page into a hidden iframe and check the contents before updating the results div. However, this option is not available in current version of Ubiquity.
Here's a screenshot of running your command and passing the text "USA GDP". Two divs get display information and 2 more start fetching additional data asynchronously as soon as the page is finished loading.
alt text http://exterbase.com/wolfram-result.png
我认为你的想法是可行的,但我认为通过 AJAX 调用 Wolfram|Alpha API 比尝试解析对 WA Web 前端的响应会更成功。 有关 WolframAlpha API 的文档,请参见此处:www.wolframalpha.com/WolframAlphaAPI.pdf
我认为改变与 API 交互的方法应该可以解决您的问题。 如果您想继续采用当前的方法,您可能需要检查内置维基百科命令的代码,以了解它们如何解析搜索结果,然后异步检索文章摘要以进行预览。
I think your idea is doable, but I think you'll have more success with an AJAX call to the Wolfram|Alpha API than by trying to parse a response to the W-A web front-end. For documentation on the WolframAlpha API, see here: www.wolframalpha.com/WolframAlphaAPI.pdf
I think changing your approach to interact with the API should solve your problems. If you want to continue pursuing your current approach, you might want to examine the code for the built-in Wikipedia command to see how they parse the search results and then asynchronously retrieve article summaries for the preview.