2012-01-06 107 views
0

我想在jsonp的回调中使用事件的preventDefault方法。我必须使用纯JavaScript。我已经有了一个模拟jsonp请求的函数。这是我在做什么:JSONP回调中的PreventDefault

var evt_temp = null; 

function onContextMenu(event) 
{  
    evt_temp = event; 
    jsonp 
    ({ 
     url: "someurl", 
     params: "someparams", 
     callback: "cb" 
    }); 
} 

function cb(response) 
{ 
    if (something == true) 
    { 
     evt_temp.preventDefault(); 
     evt_temp = null; 
    } 
} 

我的解决方案工作,但我觉得这不是一个好主意,将事件存储在var。任何人都知道更好的方法来做到这一点?

+1

你JSONP API是可怕的,解决它,所以它需要函数引用不是函数名称 – Raynos 2012-01-06 19:18:06

+0

您可能不知道JSONP是如何做出这样的评论的......制作jsonp请求的唯一方法就是这样:http:// url?callback = method。你必须将你的回调函数作为字符串发送。 – 2012-01-11 16:55:59

+0

当然我知道,但这是魔术,可以在jsonp函数中完成,为什么不能jsonp接受回调函数,然后创建一个全球uuid商店回调那里,然后做'url?callback = globaluuid' – Raynos 2012-01-11 17:08:21

回答

0

好吧,那我怎么做呢,别人的情况下,需要一些天:

var MyAPI = 
{ 
    jsonp: function(args) 
    { 
     var script = document.createElement("script"); 
     var url = args.url + "?"; 
     var generatedFunction = "jsonpCallback" + Math.round(Math.random() * 1000001); 

     window[generatedFunction] = function(response) 
     { 
      args.callback(eval("(" + response + ")")); 
      delete window[generatedFunction]; 
      document.body.removeChild(document.getElementById(generatedFunction)); 
     }; 

     if (args.params) 
     { 
      url += "_r={"; 

      for (var prop in args.params) 
      { 
       url += "\"" + prop + "\":\"" + args.params[prop] + "\","; 
      } 

      url = url.substr(0, url.length - 1); 
      url += "}&" 
     } 

     url += "_cb=" + generatedFunction; 

     script.src = url; 
     script.type = "text/javascript"; 
     script.id = generatedFunction; 

     document.body.appendChild(script); 
    } 
}; 

调用它:

MyAPI.jsonp 
({ 
    url: "someurl", 
    params: { param1: "param1", param2: "param2" }, 
    callback: function(response) 
    { 
     alert(response); 
    } 
}); 
2

它没什么反对它,但在你的情况下,它似乎有点无用。当您使用异步回调时,将在默认浏览器行为发生后调用preventDefault()。只有在事件的回调函数中直接使用它时才有意义。

+0

它不是无用的。我需要在右键单击站点中的某些链接时显示一个自定义菜单。当我点击一个链接(oncontextmenu事件)时,我发送一个jsonp请求(因为它的跨域),我应该只显示我的自定义菜单(并停止contextmenu事件)在某些情况下(根据jsonp响应)。否则,我应该做正常的行为。对不起,我的英语不好。 – 2012-01-11 16:59:01

1
function onContextMenu(event) {  
    evt_temp = event; 
    good_jsonp({ 
     url: "someurl", 
     params: "someparams", 
     callback: function (response) { 
      if (something === true) { 
       event.preventDefault(); 
      } 
     } 
    }); 
} 

var good_jsonp = (function() { 
    var uuid = 0; 
    return good_jsonp; 

    function good_jsonp(obj) { 
     var id = "good_jsonp" + ++uuid; 
     window[id] = obj.callback; 
     obj.callback = id; 
     jsonp(obj); 
    } 
}()); 
+0

我希望你是对的。我会尝试你的答案。 – 2012-01-11 17:46:31

+0

你的答案并不完整,但它给了我一个很好的开始。谢谢。 – 2012-01-11 20:36:09