Избегание Eval в вызове javascript к Pannellum - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть веб-сайт, на котором я использую javascript и pannellum API для загрузки нескольких 360 панорамных видов.

Иногда происходит сбой браузера, особенно когда на моем iPhone 6 в режиме VR, когдав разных DIV требуется всего шесть экземпляров паннеллума.

Насколько я могу судить, браузер дает сбой при вызове паннеллюма, который я выполняю из функции eval, так как данные, которые я передаю паннеллюму, содержатся впеременная.

Вот вызов, плюс последующая строка, которая сообщает нам, что панорама загружена.

eval("RightPanoInt=pannellum.viewer('RightPanoIntermediary', " + PanoDataIntermediary +");");
RightPanoInt.on("load", function() { LoadedRightPanoIntermediary(); });

Где

RightPanoInt - переменная, которую я могу использоватьчтобы проверить, загружена ли панорама

RightPanoIntermediary - это идентификатор DIV, в который должна быть загружена панорама.

и

PanoDataIntermediary - переменная, содержащая данные / параметрынужно по API паннеллюма.

Например,

{"autoLoad": true, "pitch": 0, "yaw": 73, "vaov": 180, "haov": 360, "vOffset": 0, "маxPitch ": 90," minPitch ": -90," maxYaw ": 180," minYaw ": -180," maxHfov ": 100," hfov ": 100," minHfov ": 10," showFullscreenCtrl ": false,"Ориентация: «false», «showControls»: false, «панорама»: «002.jpg», «предварительный просмотр»: «BackgroundPaleGreen.jpg»}

Данные будут другими при следующем вызове,поэтому параметры должны быть в переменной PanoDataIntermediary.

Какой альтернативный метод функции eval я могу использовать для того же вызова?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Хорошо, приведенные выше ответы заставили меня осознать, что вместо использования переменной я действительно должен использовать объект.Например ...

var PanoDataIntermediary={"type":"equirectangular"}; // to initiate
PanoDataIntermediary.panorama="Church_HDR_x4_000.jpg"; // to add more parameters
PanoDataIntermediary.autoLoad = true;   
PanoDataIntermediary.pitch=0;
PanoDataIntermediary.yaw=73;
PanoDataIntermediary.hoav=360; // etc
RightPanoInt=pannellum.viewer('panorama', PanoDataIntermediary);

Это будет работать без использования eval.Мне потребуется некоторое время, чтобы перефразировать мой существующий код, чтобы увидеть, решает ли он проблему сбоев браузера.

Еще раз спасибо.

0 голосов
/ 05 декабря 2018

Вы пробовали это (без eval)?

var RightPanoInt = pannellum.viewer('RightPanoIntermediary', PanoDataIntermediary);

По вашему вопросу, PanoDataIntermediary - это переменные данные хранения.Единственная причина, по которой вам нужно eval, заключается в том, что PanoDataIntermediary просто содержит имя другой переменной , которая содержит данные.

Более того, оператор eval("RightPanoInt=pannellum.viewer('RightPanoIntermediary', " + PanoDataIntermediary +");"); обрабатывает ваш PanoDataIntermediary объект, как если бы он был строкой, но он не строка и поэтому не может быть объединен как строка.Это может быть причиной сбоя вашего браузера.По крайней мере, это вызывает исключение.

Пример использования eval:

var myVariable = {a: 1, b:2, c:'test'};
var myVariableName = 'myVariable';
alert(eval(myVariableName).c);

Примечание. Я не рекламирую использование eval здесь.Я просто пытаюсь предложить некоторый контекст.

Надеюсь, это поможет.

...