Страница 1 из 1

Javascript conflict

Добавлено: 21 июл 2015, 09:39
DmitryRu
Мы используем StiMvcViewer версии 2015.1.11
Он расположен на страничке с большим количеством Javascript, который, например, занимается протоколированием возникающих в браузере ошибок Javascript.
Одна из используемых нами библиотек Javascript использует такой (не рекомендованный) подход:

Код: Выделить всё

    Array.prototype.compare = function (testArr) {
        if (this.length != testArr.length) return false;
        for (var i = 0; i < testArr.length; i++) {
            if (this[i].compare) {
                if (!this[i].compare(testArr[i])) return false;
            }
            if (this[i] !== testArr[i]) return false;
        }
        return true;
    };
Это создает конфликт с Вашими библиотеками, конкретнее, с кодом:

Код: Выделить всё

 var buttonNames = ["DocumentSecurityButton", "DigitalSignatureButton"];
    for (var i in buttonNames) {
        var button = exportForm.controls[buttonNames[i]];
        button.innerTable.style.width = "100%";
        button.style.minWidth = "220px";
        button.caption.style.textAlign = "center";
        button.caption.style.width = "100%";
        button.style.display = "inline-block";
    }
Проблема в том, что так писать тоже не рекомендуется, подробнее:
http://speakingjs.com/es5/ch18.html#array_iteration
http://www.2ality.com/2011/04/iterating ... ts-in.html
"1.2. for...in"
Rules:

* Iterate over property keys, including inherited ones.
* Don’t use for arrays. It iterates over both array indices and property keys. There will thus be problems as soon as someone adds a property to an array.
Мы смогли решить возникающую проблему (отчет не строился из-за ошибок Javascript), но, возможно, на проблему наткнутся другие клиенты.
Упрощенный вид кода, вызывающего проблему:

Код: Выделить всё

@using Stimulsoft.Report.Mvc;

@{
    Layout = null;
}
<!doctype html>
<html>
<head>
    <title>Report</title>
    <script type="text/jscript">
    Array.prototype.compare = function (testArr) {
        if (this.length != testArr.length) return false;
        for (var i = 0; i < testArr.length; i++) {
            if (this[i].compare) {
                if (!this[i].compare(testArr[i])) return false;
            }
            if (this[i] !== testArr[i]) return false;
        }
        return true;
    };
    </script>

</head>
<body>
    @Html.Stimulsoft().StiMvcViewer(
    "MvcViewer",
        new StiMvcViewerOptions
    {
        Actions =
       {
           GetReportSnapshot = "GetReportSnapshot",
           ViewerEvent = "ViewerEvent",
       }
        , Localization = "~/Localization/ru.xml"
        , Toolbar =
            {
                ShowDesignButton = false,
                ShowParametersButton = false
            }
        , Server =
            {
                Controller = "StiView",
                RequestTimeout = 30,
                UseRelativeUrls = true,
                PassQueryParametersForResources = false
            }
    })
</body>
</html>

Re: Javascript conflict

Добавлено: 21 июл 2015, 17:48
Vladimir
Здравствуйте Дмитрий,

Пожалуйста попробуйте добавить следующую строку кода после добавления функции compare в прототип массива:

Код: Выделить всё

Object.defineProperty(Array.prototype, 'compare', { enumerable: false });
Спасибо за замечание.

Re: Javascript conflict

Добавлено: 23 июл 2015, 09:00
DmitryRu
Спасибо, это должно помочь, хотя не работает в IE 8.
В любом случае, мы уже удалили Javascript, вызывавший проблему.

Re: Javascript conflict

Добавлено: 23 июл 2015, 10:00
Vladimir
Здравствуйте Дмитрий,

В новых версиях мы стараемся не использовать неоднозначные конструкции типа for...in.
Но обновление старого кода может потребовать времени, т.к. нужно тщательно проверять его на работоспособность. Указанные выше конструкции for() и forEach() так же имеют свои недостатки.

Спасибо.