2011-02-07 2 views
0

http://www.diigo.com/tools/diigoletdiigoletブックマークレットはクロススクリプトをどのようにして得ますか?

Diigoletでは、ブックマークレットを使用してサイトをブックマークすることができます。私が作成しているブックマークレットでは、ユーザーがいるサイトの現在のURLをサーバーに渡す必要があります。これを試すたびに、私はクロススクリプティングエラーが発生します。

誰もがディオールのようにこれを回避する方法を知っていますか?

答えて

2

本質的には、XMLHttpRequestを使用するのではなく、異なるドメインのURLをスクリプトタグに挿入することによって、になります。これは、例えば、コールバック関数でラップされているJSONの通常JSON要求とは異なることに注意:

myCallbackFunction(<JSON here>); 

(JSONのJavaScriptのオブジェクト・リテラル表記のサブセットであるので、これは動作します。)

その場合、コールバック関数の名前はdiigolet.callbackとハードコードされていますが、JSONPという仕様があり、JavaScriptライブラリsuch as jQueryがサポートされています。

JSONP仕様では、コールバック関数の名前は、GET要求のcallback=myCallbackFunctionパラメータを介してサーバーに渡されます。 jQueryのJSONPリクエストを処理できるようにするには、サーバーサイドのコードでこれを適切に処理する必要があります。

+0

彼らは間違いなくスクリプト注入を使用しています。より具体的な技術であるJSONPが使用されているかどうかを/場所で表示すると、この回答が良いでしょう。 –

+1

@Matthew:そうです、彼らはコールバック関数の名前をハードコードします。残念ながら、コードが縮小されているため、コードの特定の行を簡単に表示することはできません。 FirebugのNetパネルや改ざんデータを見ることで、どのように動作するかの写真を得ることができると思います。 – PleaseStand

+0

あなたの好奇心が強い方は、あなたのサーバが以下のフォーマットでコールバックを返す必要があります: "callback = callBackThisFunction"を渡した場合、サーバーは "callBackThisFunction(JSON HERE)"を返す必要がありますDjangoではこれは次のようになります:return HttpResponse(request.GET ["callback"] + '(' + simplejson.dumps(jsonstring)+ ')')。これは、JSON.ajax()コマンドを使用し、dataType = "JSONP"を設定していることを前提としています。注:この例では、request.GET ['callback']は "callBackThisFunction"と等しくなります。 – Yoshi9143

関連する問題