Jos*_*ody 6 javascript json jsonp bookmarklet
我正在寻找一个跨站点书签,它获取一个突出显示的单词,将其传递给CodeIgniter方法(domain.com/controller/method),并通过字典API返回定义.我有一个骨架在单个域上运行良好,但我希望扩展它以使用JSONP跨域.但我觉得不清楚.
我知道我需要从远程位置加载脚本并将其注入当前上下文中.我相信我需要在页面上显示突出显示的单词,然后调用一个类似于domain.com/controller/method/word的URL 来获取该脚本.然后它变得模糊.
我想我基本上有两个问题:
答:这不是对XMLHTTPRequest的补充,这取代了它,因此完全删除了该步骤.新脚本调用该方法,通过查询字符串传递必要信息,并接收响应中的JSON数组.
word(json_encode($array));?答:是的,我会把它传回去callbackFunctionName(json_encode($array));.
更新
我把上面三个答案中的两个答案包括在内.如果有人能够彻底解释事情,我当然会将他们的答案标记为正确,否则我会在答案中阐述我的绊脚石.我仍然不知道在哪里编写回调函数以及我将在JS中使用它做什么.
非常感谢您提供的任何帮助.
首先使用您可以放在书签栏上的链接设置书签:
<html>
<head></head>
<body>
<a href="javascript:(function(src, cb){var s = document.createElement('script');s.charset = 'UTF-8';document.body.insertBefore(s, document.body.firstChild);s.src = src;if(typeof cb === 'function'){s.onload = cb;s.onreadystatechange = function(){(/loaded|complete/).test(s.readyState)&&cb(s);};}return s;}('http://github.com/pure/pure/raw/master/libs/pure.js', function(e){alert('loaded');}))">load</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
用脚本替换url,它将在主机页面上加载并运行.
但是它现在位于托管页面中,并且XMLHTTPRequest由于域不匹配而无法调用您的服务器.
这是JSONP.
在加载的脚本中,您可以放置一个函数,例如: function srvCallback(json){...}
当您想要调用服务器时,您将使用与上面的书签类似的功能将其作为脚本注入:
function jsonp(src){
var s = document.createElement('script');
old = document.getElementById('srvCall');
old && document.body.removeChild(old);
s.charset = 'UTF-8';
s.id = 'srvCall';
document.body.insertBefore(s, document.body.firstChild);
s.src = src + '?' + new Date().getTime();
}
Run Code Online (Sandbox Code Playgroud)
注入您的请求,例如:
jsonp('http://domain.com/controller/method/word')
Run Code Online (Sandbox Code Playgroud)
服务器应该响应如下:
srvCallback({word:'hello'});
Run Code Online (Sandbox Code Playgroud)
最后srvCallback,在您获得JSON的函数内自动调用该函数,并将结果显示给用户.
| 归档时间: |
|
| 查看次数: |
1416 次 |
| 最近记录: |