JSONP

عملکرد

عنصر اچ تی ام‌ال <script> مجاز به اجرای محتوای برگرفته از منابع خارجی است. سرویس های پاسخ داده با داده های JSON (انگلیسی) خالص قادر به اشتراک گذاری داده ها در دامنه قبل از تصویب CORS(انگلیسی) (اشتراک منابع متقابل) نبودند. به عنوان مثال ، یک درخواست به یک سرویس خارجی http://server.example.com/Users/1234 ممکن است یک رکورد برای یک شخص بنام فرضی "پارس" را با فرمت جیسون برگرداند. بشکل زیر: 
1 {2     "Name": "پارس",3     "Id": ۱۲۳۴,4     "Rank": ۷5 }
هنگام استفاده از داده ها بشکل فوق در دامنه ها منجر به خطای جاوااسکریپت خواهد شد. زیرا جاوا اسکریپت قادر نیست دیتای چیسون را بشکل خام  بدون کمک گرفتن از ایجکس از منابع خارجی برگرداند
1 <script type="application/javascript"2         src="http://server.example.com/Users/1234">3 </script>
مرورگر پرونده <script> را بارگیری می کند ، محتوای آن را ارزیابی می کند ، داده های JSON خام را به عنوان یک بلاک تفسیر می کند و خطای نحوی ( syntax (انگلیسی)) را برمیگرداند. حتی اگر داده ها به عنوان یک چهارچوب جاوااسکریپت تعبیر شوند ، همچنان نمی توان با جاوااسکریپتی که در مرورگر اجرا می شود ، دسترسی پیدا کرد ، زیرا بدون تعیین تکلیف متغیر ، اعضای شیء غیرقابل دسترس هستند.
در الگوی استفاده JSONP ، درخواست نشانی وب که به صفت src در عنصر <script> اشاره شده است داده های JSON (انگلیسی) را بازمی گرداند ، با کد جاوااسکریپت (معمولاً یک تابع) که در اطراف آن پیچیده شده است. این "بار مقدار دهی شده" و سپس توسط مرورگر اجرا می شود. به این ترتیب ، تابعی که قبلاً در محیط جاوااسکریپت تعریف شده است می تواند داده های (انگلیسی) را مقدار دهی کند. یک درخواست و پاسخ معمولی JSONP در زیر نشان داده شده است.

اگر این محتوا:
parseResponse({"name":"mahmoud", "fname":"mansouri", "age":۳۵, "city":"shiraz", "webSite":"۱mansouri.ir"});

در یک آدرس خارجی قرار داشته باشد به آدرس فرضی:
http://server.example.com/Users/1234
در هر آدرسی که به آن نیاز است با کمک  صفت src در عنصر <script> فراخوانی گردد. و کافیست تابع parseResponse را ساخته و بتمام مقادیر آن دسترسی داشته باشید. بدون نگرانی بابت اشتراک منابع متقابل (cross-domain policy).

تزریق عنصر اسکریپت

JSONP (انگلیسی) فقط هنگامی که از عنصر اسکریپت استفاده می شود معقول است. برای هر درخواست JSONP جدید ، مرورگر باید یک عنصر <script> جدید اضافه کند ، یا از مورد قبلی دوباره استفاده کند. گزینه قبلی - اضافه کردن یک عنصر اسکریپت جدید - از طریق دستکاری مدل شی‌گرای سند (DOM (انگلیسی) ) امکان پذیر است. و به عنوان تزریق عنصر اسکریپت شناخته می شود. عنصر <script> به مدل شیءگرای سند HTML) ((انگلیسی)DOM تزریق می شود ، با نشانی وب (URL (انگلیسی))  انتهای مورد نظر JSONP به عنوان ویژگی src تنظیم می شود. این تزریق عنصر اسکریپت پویا معمولاً توسط یک کتابخانه جاوااسکریپت  انجام می شود. جی‌کوئری و چهارچوب های دیگر توابع و چهارچوب های لازم برای JSONP دارند. گزینه های مستقل نیز وجود دارند.

نمونه ای از استفاده از جی‌کوئری برای تزریق پویا عنصر اسکریپت برای تماس JSONP به این شکل است :
// Using YQL and JSONP$.ajax({
    url: "http://query.yahooapis.com/v1/public/yql",
 
    // The name of the callback parameter, as specified by the YQL service
    jsonp: "callback",
 
    // Tell jQuery we're expecting JSONP
    dataType: "jsonp",
 
    // Tell YQL what we want and that we want JSON
    data: {
        q: "select title,abstract,url from search.news where query=\"cat\"",
        format: "json"
    },
 
    // Work with the response
    success: function( response ) {
        console.log( response ); // server response
    }});