jquery.transport.xdr
Version:
A jQuery plugin that enables cross-domain AJAX requests for IE8 and IE9 with XDomainRequest.
145 lines (120 loc) • 4.72 kB
Markdown
# jQuery plugin for cross-domain CORS ajax-requests in Internet Explorer 8 and 9
Internet Explorer 8 and 9 versions doesn't support cross-domain **CORS** ajax-requests with **XMLHttpRequest**,
for these purposes IE 8/9 using **XDomainRequest**. `jquery-transport-xdr` makes transparent replasement **jQuery** transport, that's allow cross-domain ajax-requests in IE8 and IE9 without changing source code.
## Limitations
**XDomainRequest** have some limitations:
* server must return **Access-Control-Allow-Origin** header as for usual **CORS** request
* **HTTP** and **HTTPS** only allowed
* **GET** and **POST** only allowed
* custom headers can't be added to request
* there is no **Content-Type** header in request
* **Cookie** can't be sended
* source scheme of URI (**https**://source) must be the same as destination URI scheme (**https**://destination)
* there is no ability to get success response code
* there is no ability to get failure response code
## Installation
1. Add [jquery-transport-xdr](http://cdn.rawgit.com/gfdev/javascript-jquery-transport-xdr/master/dist/jquery.transport.xdr.min.js) to HTML body **after** jQuery:
```html
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<!--[if (IE 8)|(IE 9)]><script src="//cdn.rawgit.com/gfdev/javascript-jquery-transport-xdr/master/dist/jquery.transport.xdr.min.js"></script><![endif]-->
```
or **Bower**:
```
$ bower install jquery-transport-xdr
```
```html
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<!--[if (IE 8)|(IE 9)]><script src="//host/path/bower_modules/dist/jquery.transport.xdr.min.js"></script><![endif]-->
```
or **NPM**:
```
$ npm install jquery-transport-xdr
```
```html
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<!--[if (IE 8)|(IE 9)]><script src="//host/path/node_modules/dist/jquery.transport.xdr.min.js"></script><![endif]-->
```
## Usage examples
After adding [jquery-transport-xdr](http://cdn.rawgit.com/gfdev/javascript-jquery-transport-xdr/master/dist/jquery.transport.xdr.min.js) you can make ajax-requests as usual, without changing code:
`POST:`
```javascript
var xhr = $.ajax({
type: 'POST',
url: 'https://baconipsum.com/api/?type=meat-and-filler&format=json',
dataType: 'json'
});
```
`GET:`
```javascript
var xhr = $.ajax({
type: 'GET',
url: 'https://baconipsum.com/api/?type=meat-and-filler&format=json',
dataType: 'json'
});
```
#### Option **forceMethod**
**XDomainRequest** have limitations, it doesn't allow **PUT**, **DELETE**, **PATCH** and **HEAD** requests, you will receive error **XXX Method Not Allowed** if try to use some of them, but `jquery-transport-xdr` can make replacement:
* **HEAD** => **GET**
* **PUT**|**DELETE**|**PATCH** => **POST**
You should use option **forceMethod**:
`HEAD:`
```javascript
var xhr = $.ajax({
type: 'HEAD',
url: 'https://baconipsum.com/api/?type=meat-and-filler&format=json',
dataType: 'json',
forceMethod: true
});
```
**HEAD** will be replaced with **GET** in this case and `__method=HEAD` will be added to request params in URI:
`https://baconipsum.com/api/?type=meat-and-filler&format=json`
=>
`https://baconipsum.com/api/?type=meat-and-filler&format=json&__method=HEAD`
Param `__method` you can get on server and deretmine **original** method.
The same way for methods **PUT**, **DELETE** and **PATCH** except for param `__method` will be added to request body and original method will be replaced with **POST**:
`PUT:`
```javascript
var xhr = $.ajax({
type: 'PUT',
url: 'https://baconipsum.com/api/?type=meat-and-filler&format=json',
data: { test: 'test' },
dataType: 'json',
forceMethod: true
});
```
`PUT` => `POST`
```
POST /api/?type=meat-and-filler&format=json HTTP/1.1
Host: baconipsum.com
Connection: keep-alive
Content-Length: 0
Pragma: no-cache
Cache-Control: no-cache
test=test&__method=PUT
```
### Option **forceContentType**
**XDomainRequest** limitations doesn't allow to send **Content-Type** header, but you can send it if will add **forceContentType** option:
```javascript
var xhr = $.ajax({
type: 'POST',
url: 'https://baconipsum.com/api/?type=meat-and-filler&format=json',
data: { test: 'test' },
dataType: 'json',
forceContentType: true
});
```
**Content-Type** value will be sended in `__contentType` param.
**forceContentType** and **forceMethod** options can be used together:
```javascript
var xhr = $.ajax({
type: 'PATCH',
url: 'https://baconipsum.com/api/?type=meat-and-filler&format=json',
contentType: 'multipart/form-data; charset=UTF-8',
data: { test: 'test' },
dataType: 'json',
forceMethod: true,
forceContentType: true
});
```
## License
**MIT** license.