我有一个书签,当点击时会在当前页面上打开一个div弹出窗口(例如www.cnn.com)。这个div有一个按钮,单击该按钮会向我的应用程序域发出jQuery.get请求。这一切都运行正常,但我在响应中收到错误。这是发出请求的函数
function postWishXML(){
jQuery(".ServerResponse").ajaxError(function(event, XMLHttpRequest, ajaxOptions){
//entering here
});
var Wish = wishObject();
if(Wish == false)
{
jQuery('.ServerResponse').html('Please enter a gift title');
jQuery('.GiftText').val('');
}else
{
jQuery('.ServerResponse').html('');
var WishXML = createXMLTags(Wish);
jQuery.get(Root+'/apps/shop/toolbar/WishlistPopup.ashx',
{'sap':Cookie,'wish':WishXML},
Response,
'text'
);
}
}
这是服务器代码
public void ProcessRequest (HttpContext context) {
if (SecurityContext.IsAuthenticated || SecurityContext.IsSemiAuthenticated)
{
if (!string.IsNullOrEmpty(context.Request["wish"]))
{
string res = "Your wish has been added";
context.Response.ContentType = "text/plain";
context.Response.Write(res);
context.Response.End();
}
}
我的问题是否与跨域脚本或语法有关?
由于
答案 0 :(得分:2)
我认为你是对的。看起来您正在遇到跨站点脚本限制。
请记住,您将javascript代码插入目标网站的代码中。因此,就像代码从他们的页面运行一样。换句话说,您正试图从页面内部(例如,www.cnn.com)发出AJAX请求,并从您的站点(另一个域)检索数据。
我在文章here中找到的一种解决方案。这是要点:
function loadScript(scriptURL) {
var scriptElem = document.createElement('SCRIPT');
scriptElem.setAttribute('language', 'JavaScript');
scriptElem.setAttribute('src', scriptURL);
document.body.appendChild(scriptElem);
}
loadScript(Root + '/apps/shop/toolbar/WishlistPopup.ashx');
让您的服务器脚本返回将被评估的javascript。
第二种,可能更优选的选项是使用JSONP。实质上,您的服务器将使用包含在命名函数中的JSON数据进行响应。你告诉jQuery.ajax请求你期望一个jsonp响应以及返回函数的名称。这几乎就是在做上面的事情,但是它附带了更多的安全性和语法糖。
这将是PHP版本,但它应该得到重点。假设您需要的所有数据都在$ data中,请记住,您可以将JSON结构中的匿名函数放入成功处理程序中进行评估。
$json = json_encode($data);
echo $_GET['jsonp_callback'] . '(' . $json . ');';
javascript:
$.ajax({
dataType: 'jsonp',
jsonp: 'jsonp_callback',
url: Root + '/apps/shop/toolbar/WishlistPopup.ashx',
success: Response,
});
为了给予适当的信任,我从Andrew Moore对this question
的答案中窃取并修改了这个JSONP示例