我需要在Chrome扩展程序中执行跨域请求.我知道我可以通过消息传递,但我宁愿坚持只是jQuery习语(所以我的JavaScript也可以作为一个<script src="">).
我做的很正常:
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
但在错误控制台中我看到:
Uncaught ReferenceError: jsonp1271044791817 is not defined
Run Code Online (Sandbox Code Playgroud)
jQuery没有正确地将回调函数插入到文档中吗?我能做些什么来完成这项工作?
(如果我将代码粘贴到chrome控制台中,它可以正常工作,但如果我把它作为page.js放在扩展名中就会出现问题.)
我是JSONP开发的新手,我发现IE 7/8不会清理JSONP脚本占用的内存.运行几个小时后,这会在我的页面中导致非常高的内存消耗.
我浏览了互联网,发现大多数修复都是基于Neil Fraser的提示.从博客中可以看出,您需要使用类似的代码删除脚本中的所有属性
var tmp;
while (tmp = document.getElementById('JSONP')) {
tmp.parentNode.removeChild(tmp);
// this deletion will create error in IE.
for (var prop in tmp) delete tmp[prop];
tmp = null;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,删除将在IE中创建"对象不支持此操作"的错误,并且它不会释放内存.
所以我的问题是如何真正释放我的JSONP脚本的内存?
我把我的测试代码如下:
Testing.html
<html><head></head><body><script>
var script,
head = document.getElementsByTagName('head')[0],
loadCount= 0,
uuid= 1,
URL= "memleaktest.js?uuid=",
clearConsole = function() {
var con= document.getElementById("console");
while (con.childNodes.length)
con.removeChild(con.childNodes[0]);
},
log = function(msg) {
var div= document.createElement("DIV"),
text= document.createTextNode(msg),
con= document.getElementById("console");
div.appendChild(text);
con.appendChild(div);
},
test = { "msg" : null, …Run Code Online (Sandbox Code Playgroud) 我正在使用跨域Ajax请求到外部API.每隔一段时间它就会失败,并显示控制台消息:
Uncaught TypeError: Property 'photos' of object [object DOMWindow] is not a function
Run Code Online (Sandbox Code Playgroud)
查看返回的JSON,它是有效的JSON,因此它不是外部API的错误.
我无法可靠地重现错误:似乎触发错误的唯一因素是我快速重复地调用请求.
在这种情况下,当用户移动Google地图时(我向地图添加标记),我会调用Ajax请求,如果用户移动得太快,就会发生这种情况.
以下是我的代码的相关部分:
// Code located inside an external JS file referenced inside the head
// Not wrapped inside document.ready - but all the code setting up
// the map (calling a function which calls a function which adds the
// tilesloaded listener) *is* inside document.ready
function addMarkers() {
var pm_url = "http://www.cyclestreets.net/api/photos.json?key=" + MY_KEY;
$.ajax({
url: pm_url,
crossDomain: true,
contentType: "application/json",
dataType: 'jsonp',
data: pmdata, …Run Code Online (Sandbox Code Playgroud) 我有一个现有的服务,如下面的方法:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class SomeService : ISomething
{
public SomeListResults SomeList(SomeParams someParams)
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以同时允许JSONP调用和JSON(检测它).这是原生的吗?
我正在尝试输出正确包装的JSONP值以供jQuery使用.
我正在寻找的输出是:
jsoncallback({"Status": "OK"})
Run Code Online (Sandbox Code Playgroud)
但它输出的atm:
"jsoncallback({"Status": "OK"})"
Run Code Online (Sandbox Code Playgroud)
显然这不是正确的JSONP格式,因为jQuery请求无法处理响应.
我在C#中的OperationContract是:
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "returndata?s={s}")]
Stream EchoWithGet(string s);
public string EchoWithGet(string s)
{
string json = @"jsoncallback({'Status':'OK'})";
Console.WriteLine("Call Made: " + s);
return json;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用JSON.NET和System.Web.Script命名空间使用JavaScriptSerializer.
但是没有什么对我有用,我真正想做的就是摆脱两个双引号.
我希望能够使用CORS来设置资源,使用CORS来请求我的数据.我有CORS使用$ http,但相同的技术不适用于$ resource我希望有人可以来救我并告诉我如何使用$ resource.
我已经修改了Angular教程的最后一步,通过在services.js文件中攻击phonecatServices服务来使用CORS.
我发现这个例子使用$ http.defaults.useXDomain = true; 删除$ http.defaults.headers.common ['X-Requested-With'];行获取使用CORS请求数据的角度但是如果我尝试$ resource.defaults.useXDomain = true; 我收到错误:"无法设置未定义的属性'useXDomain'".
我认为$ resource没有这个属性,所以我的问题是,如何使用CORS配置$ resource来发出跨域资源请求.
这是我的代码:
angular.module('phonecatServices', ['ngResource']).
factory('Phone', function($resource){
return $resource('http\\://localhost\\:8080/:phoneId.json', {}, {
query: {params:{phoneId:'phones'}, isArray:true}
});
});
Run Code Online (Sandbox Code Playgroud)
当我尝试发出请求时出现以下错误:对象#<资源>没有方法'推送'
编辑
我已经尝试设置$ http并且它大部分时间都可以工作,但是当调用资源查询时,在这种情况下是Phone.get(phoneId); 这似乎抛出了上述错误.
调用我怀疑导致错误的代码(来自controllers.js 第11步角度教程):
function PhoneDetailCtrl($scope, $routeParams, Phone) {
$scope.phone = Phone.get({phoneId: $routeParams.phoneId}, function(phone) {
$scope.mainImageUrl = phone.images[0];
});
$scope.setImage = function(imageUrl) {
$scope.mainImageUrl = imageUrl;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除上述方法的内部代码运行正常(没有获得网站的图像),但我不明白为什么这不起作用?我已经设置了$ http服务来使用CORS,所以应该将它传递给$ resource.
任何人都可以对此有所了解吗?(任何工作示例代码将不胜感激).
编辑:13/08/13
正如所有访问这个问题的人都知道的那样,下面的答案都没有真正回答过这个问题,我正在研究一个答案,但是如果有人发现这个并且有答案我会非常感激它.
编辑:06/09/13
目前正在调查这个项目,似乎允许我正在寻找的一切:https …
我正在尝试使用以下代码获取JSONP响应...
$http.jsonp('http://example.com:8888/?callback=JSON_CALLBACK').success( function( response )
{
console.dir( response );
});
Run Code Online (Sandbox Code Playgroud)
http://example.com:8888/?callback=JSON_CALLBACK通过node.js返回以下内容
JSON_CALLBACK({date:'2013-05-15T08:53:51.747Z'});
标题是在node.js中设置的,就像这样....
res.writeHead(200, {'Content-Type': 'application/json'});
Run Code Online (Sandbox Code Playgroud)
但我在Chrome控制台中遇到的错误是......
Uncaught ReferenceError: JSON_CALLBACK is not defined
Run Code Online (Sandbox Code Playgroud)
但是,奇怪的是,如果我创建window.JSON_CALLBACK(response)它将运行它的功能.但我认为成功意味着代表我这样做.
我在域A上托管了一些JavaScript,它向域B上的服务发出JSONP请求.对B/Auth的请求设置包含身份验证令牌的cookie.对域B上的其他服务的后续请求也应包含此cookie.
在Chrome中,这种机制非常有效; cookie被设置,发送,并返回数据.在IE10中,Set-Cookie标头返回来自B/Auth的响应,但不包括在后续请求中.
Set-Cookie MINT_SESSIONTOKEN=MyDST={TOKEN}; expires=Thu, 10-Oct-2013 11:57:45 GMT; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)
经过一些谷歌搜索和实验后,我发现如果我将IE的隐私设置(Internet选项>隐私)设置为低或接受所有Cookie,则会随后向域B请求发送cookie.任何高于低的设置都会阻止cookie被发送.
虽然这对我来说解决了这个问题,但对于那些为了获取数据而必须重新配置其隐私设置的用户来说,它并没有解决问题.
我对引擎盖下究竟发生了什么感到困惑.我认为IE将cookie视为第三方并阻止它被设置(尽管cookie被设置为并被发送到域B),这就是为什么在后续请求中省略它的原因.
我可以做些什么来阻止IE阻止cookie,而用户不必修改他们的浏览器隐私设置?
我正在尝试使用JSONP将大量数据(~50000字节)发送到另一台服务器,但我得到414(Request-URI Too Large)响应(JSONP只允许GET).将数据拆分为2k块会减慢整个应用程序的速度,因此我正在寻找其他解决方案.
我试图在Apache的虚拟主机中更改LimitRequestLine指令,但似乎这没有效果,仍然是同样的错误.
任何其他想法如何发送来解决这个问题?也许比JSONP还有其他一些解决方案?
我正试图让Twitter Typeahead + Bloodhound与Google的CSE合作.
到目前为止,我已经设法返回结果,但我无法计算出datumTokenizer.
var results = new Bloodhound({
datumTokenizer: function(data) {
return Bloodhound.tokenizers.whitespace(d.value)
},
queryTokenizer: Bloodhound.tokenizers.obj.whitespace,
remote: {
url: "http://clients1.google.com/complete/search?client=partner&hl=en&sugexp=gsnos%2Cn%3D13&gs_rn=25&gs_ri=partner&partnerid=004914516364918182382%3Ayfqw09r4qvu&types=t&ds=cse&cp=3&gs_id=15&q=%QUERY&callback=showResults&duffCallback=?",
ajax: $.ajax({type:'GET',dataType:'jsonp',jsonp:'duffCallback'}),
filter: showResults
}
});
Run Code Online (Sandbox Code Playgroud)
看小提琴:http://jsfiddle.net/thugsb/3KAjh/
你会看到我将showResults()作为一个数组返回结果.但是,从中调用showResults()filter:似乎没有做任何事情,因为删除该行没有任何效果.所以我不太确定发生了什么.
请注意,duffCallback是我在阅读这个问题时要做的.如果有更好的方法来完成这项工作,我会全都耳朵!
jsonp ×10
javascript ×4
jquery ×3
angularjs ×2
c# ×2
cors ×2
json ×2
wcf ×2
ajax ×1
asp.net ×1
bloodhound ×1
cookies ×1
memory ×1
memory-leaks ×1
typeahead.js ×1
web-services ×1
wpf ×1