2012-01-06 12 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

+0

JSONPがそのようなコメントをするのはわかりません... jsonpリクエストを行う唯一の方法は、http:// url?callback = methodです。コールバック関数を文字列として送信する必要があります。 –

+0

もちろん、私はそれを知っていますが、それはjsonp関数で実行できる魔法です。どうしてjsonpがコールバック関数を受け入れることができないのでしょうか?そして、グローバルUUIDストアを作成してコールバックを作成し、 'url?callback = globaluuid'を実行してください。 – Raynos

答えて

0

まあ、いつか必要に誰かの場合には、私はそれを作った方法のthats:

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リクエスト(そのクロスドメイン)が表示され、特定のケースで(jsonpの応答に従って)自分のカスタムメニューを表示してコンテキストメニューのイベントを停止する必要があります。それ以外の場合は、私は正常な動作を行う必要があります。私の悪い英語のために申し訳ありません。 –

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

私はあなたが正しいと願っています。私はあなたの答えを試してみます。 –

+0

あなたの答えはいっぱいではありませんが、それは私にそれを作る方法の良いスタートを与えました。ありがとう。 –

関連する問題