我正在尝试为我们构建的特殊 URL 缩短服务构建一个 javascript 书签http://esv.to http://esv.to用于缩短经文参考文献(即“马太福音 5 章”变为“http://esv.to/Mt5 http://esv.to/Mt5“。小书签应该执行 GET 请求http://api.esv.to/Matthew+5 http://api.esv.to/Matthew+5,它返回一个text/plain
的响应http://esv.to/Mt5
.
小书签本身的代码如下所示(为了便于阅读而进行了扩展):
var body = document.getElementsByTagName('body')[0], script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://esv.to/media/js/bookmarklet.js';
body.appendChild(script);
void(0);
代码来自http://esv.to/media/js/bookmarklet.js
看起来像这样:
(function() {
function shorten(ref, callback) {
var url = "http://esv.to/api/" + escape(ref);
var req = new XMLHttpRequest();
req.onreadystatechange = function shortenIt() {
if ( this.readyState == 4 && this.status == 200 ) {
callback(req.responseText);
};
};
req.open( "GET", url );
req.send();
};
function doBookmarklet() {
var ref = prompt("Enter a scripture reference or keyword search to link to:", "")
shorten(ref, function (short) {
prompt("Here is your shortened ESV URL:", short);
});
};
doBookmarklet();
})();
当从http://esv.to http://esv.to书签本身可以正常工作。但是当在另一个页面上使用时,它就不会了。奇怪的是,当我查看 Firebug 的请求时,响应是200 OK
,浏览器下载了17个字节(返回字符串的长度),但响应正文为空!不会引发任何错误,只是 XmlHttpRequest 对象上出现一个空的responseText。
现在,根据来自 Bookmarklet 的 Ajax 调用 https://stackoverflow.com/questions/664689/ajax-call-from-bookmarklet, GET 不应违反同源策略。这是一个错误吗?有解决方法吗?