2016-10-05 4 views
0

Может кто-нибудь предложить какие-либо советы, пожалуйста?IE и javascript и двоичные данные

У меня есть очень простой ServerSide Node.js функцию, которая принимает двоичные данные и просто вторит его обратно:

app.post('/SetBinaryData', function(req, res) 
           { 
            var echo = new Buffer(0); 

            req.on('data', function (data) 
            { 
             echo = Buffer.concat([echo,data]); 
            }); 

            req.on('end', function() 
            { 
             res.end(echo); 
            }); 
           } 
    ); 

Я называю это со стороны клиента на нажатие кнопки следующим образом:

function OnButton3() 
{ 
    var buffer = new ArrayBuffer(8 + 2); 

    var dataview = new DataView(buffer); 

    dataview.setFloat64(0, 3.4, false); 

    dataview.setInt16(8, 7 , false); 

    AJAXSendBinaryData(AJAXGetRequestObject(), "[URL HERE]/SetBinaryData", "args=1,2,3", dataview, OnServerBinaryCallCompleted, 9, false); 
} 

моего AJAX вызов (завернутый в моей функции AJAXSendBinaryData) имеет следующие атрибуты:

ajaxRequestObject.open('POST', szURL, true); 
ajaxRequestObject.responseType = "arraybuffer"; 
ajaxRequestObject.setRequestHeader('Content-Type', 'application/octet-stream'); 

и функция OnLoad содержит:

ajaxRequestObject.onload = function(oEvent) 
{ 
    var arrayBuffer = ajaxRequestObject.response; 

    if(arrayBuffer) 
    { 
     var dataView = new DataView(arrayBuffer); 

     OnCallCompleted(dataView); 
    } 
} 

Метод OnCallCompleted является:

function OnServerBinaryCallCompleted(dataview) 
{ 
    var value1 = dataview.getFloat64(0); 
    var value2 = dataview.getInt16(8); 
    alert(dataview.byteLength); 
    alert(value1.toString() + "\n" + value2.toString()); 
} 

Это работает на Firefox, Opera, Chrome.

Я вижу первое предупреждение о «10» (число байтов, которые я послал), а затем я вижу сообщение 3.4 и 7.

, но в Internet Explorer 11, я вижу, не 10, а 15 (независимо от того, сколько данных я посылаю)

(Примечание, может быть полезным, если я определить данные, как:

var data = [253.432, 0.432, 128.654, 1.456]; 
var dataview = new Float64Array(data); 

и отправить, что и на обратный вызов просто обрабатывать его как массив, то все хорошо на все браузеры, но я хочу смешивать типы данных).

Спасибо за любые мысли, Mitch.

ответ

0

Решено. Ошибка в IE. Исправить, отправив объект ArrayBuffer в запрос AJAX вместо объекта DataView. Работает во всех браузерах.

Mitch.