Проблема в работе кода 2

SM
На сайте с 11.11.2014
Offline
18
748

На странице загрузки программы есть код, меняющий CSS-класс (тем самым подбирая ссылку пакета нужной битности для ОС пользователя):

<body onload="T0=new CngClass('selected');
if (navigator.userAgent.indexOf('Windows NT 5.1')!=-1 || navigator.platform.indexOf('Win32')!=-1) T0.CngClass('win5');

if (navigator.userAgent.indexOf('Windows NT 6.0')!=-1 && navigator.platform.indexOf('Win32')!=-1) T0.CngClass('win6');
if (navigator.userAgent.indexOf('Windows NT 6.0')!=-1 && navigator.platform.indexOf('Win64')!=-1 || navigator.userAgent.indexOf('WOW64')!=-1) T0.CngClass('win6-64');

if (navigator.userAgent.indexOf('Windows NT 6.1')!=-1 && navigator.platform.indexOf('Win32')!=-1) T0.CngClass('win7');
if (navigator.userAgent.indexOf('Windows NT 6.1')!=-1 && navigator.platform.indexOf('Win64')!=-1 || navigator.userAgent.indexOf('WOW64')!=-1) T0.CngClass('win7-64');

if (navigator.userAgent.indexOf('Windows NT 6.2')!=-1 && navigator.platform.indexOf('Win32')!=-1) T0.CngClass('win8');
if (navigator.userAgent.indexOf('Windows NT 6.2')!=-1 && navigator.platform.indexOf('Win64')!=-1 || navigator.userAgent.indexOf('WOW64')!=-1) T0.CngClass('win8-64');
">

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

А то захожу я под Win7 32-bit или Vista 32-bit, и проблем нет, – выдается пакет для этих систем.

Также и для Win7 64-bit и Vista 64-bit, в 32-битных браузерах, – но стоит мне только зайти в этих системах под 64-битными браузерами, то выдаётся пакет для Win8 64-бит!

Помогите наладить код. Сам я только знакомлюсь с JS, и методом тыка уже намучился пол дня, всё без результата.

P.S.

Для общей картины.

Код панели загрузки:

 <ul class="dd-panel">
<li onclick="T0.CngClass(this);" id="win8">
<a href="//download...">Скачать Explorer</a>
<em>для Windows 8 32-bit</em>

<li onclick="T0.CngClass(this);" id="win8-64">
<a href="//download...">Скачать Explorer</a>
<em>для Windows 8 64-bit</em>

<li onclick="T0.CngClass(this);" id="win7">
<a href="//download...">Скачать Explorer</a>
<em>для Windows 7 32-bit</em>

<li onclick="T0.CngClass(this);" id="win7-64">
<a href="//download...">Скачать Explorer</a>
<em>для Windows 7 64-bit</em>

<li onclick="T0.CngClass(this);" id="win6">
<a href="//download...">Скачать Explorer</a>
<em>для Windows Vista 32-bit</em>

<li onclick="T0.CngClass(this);" id="win6-64">
<a href="//download...">Скачать Explorer</a>
<em>для Windows Vista 64-bit</em>

<li onclick="T0.CngClass(this);" id="win5">
<a href="//download...">Скачать Explorer</a>
<em>для Windows XP 32-bit</em>
</ul>

Код скрипта, назначающий класс "selected":

/* Назначение класса */
var T0;
function CngClass(a) {
this.lst = null;
this.cls = a
}
CngClass.prototype.CngClass = function(a) {
if (typeof(a) == "string") {
a = document.getElementById(a)
}
if (this.lst) {
this.lst.className = ""
}
a.className = this.cls;
this.lst = a
};
/* Конец кода назначения класса */
ДП
На сайте с 23.11.2009
Offline
203
#1

if (navigator.userAgent.indexOf('Windows NT 6.0')!=-1 && (navigator.platform.indexOf('Win64')!=-1 || navigator.userAgent.indexOf('WOW64')!=-1))

скобочек попробуйте в условия добавить, а сдаётся мне там все слева-направо просто проходится и для 64-итных платформ срабатывает

 || navigator.userAgent.indexOf('WOW64')!=-1

просто

SM
На сайте с 11.11.2014
Offline
18
#2
Дикий пионер:

скобочек попробуйте в условия добавить, а сдаётся мне там все слева-направо просто проходится и для 64-итных платформ срабатывает

На примере одной строки покажите куда скобки добавить, а то справа добавил (как в вашем примере), а слева не знаю куда :)

ЗЫ

Сдается мне, на днях начну плотно изучать JS, а то стыдно как-то становится... )

S
На сайте с 30.09.2016
Offline
469
#3

Имеются в виду приоритеты: сначала делается "и", потом "или". А последующая операция "затирает" предыдущую. То есть у Вас сначала срабатывает выбор 'win7-64' по совпадению

navigator.userAgent.indexOf('WOW64')!=-1,

а после этого срабатывает выбор 'win8-64' по тому же самому совпадению (последняя строка). Чтобы расставить приоритет "или" а потом "и", надо написать

if (navigator.userAgent.indexOf('Windows NT 6.1')!=-1 && (navigator.platform.indexOf('Win64')!=-1 || navigator.userAgent.indexOf('WOW64')!=-1)) T0.CngClass('win7-64');
В сам код я особо не вникал, но пока вот так получается.
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
SM
На сайте с 11.11.2014
Offline
18
#4
Sitealert:
Имеются в виду приоритеты: сначала делается "и", потом "или". А последующая операция "затирает" предыдущую. То есть у Вас сначала срабатывает выбор 'win7-64' по совпадению
navigator.userAgent.indexOf('WOW64')!=-1,
а после этого срабатывает выбор 'win8-64' по тому же самому совпадению (последняя строка). Чтобы расставить приоритет "или" а потом "и", надо написать
if (navigator.userAgent.indexOf('Windows NT 6.1')!=-1 && (navigator.platform.indexOf('Win64')!=-1 || navigator.userAgent.indexOf('WOW64')!=-1)) T0.CngClass('win7-64');
В сам код я особо не вникал, но пока вот так получается.

Пораскинул мозгами, и следуя вашему совету в итоге всё заработало в таком варианте:

<body onload="T0=new CngClass('selected');
if (navigator.userAgent.indexOf('Windows NT 5.1')!=-1) T0.CngClass('win5');

if (navigator.userAgent.indexOf('Windows NT 6.0')!=-1 && navigator.userAgent.indexOf('WOW64')!=-1 + (navigator.userAgent.indexOf('Win64')!=-1)) T0.CngClass('win6-64');
else if (navigator.userAgent.indexOf('Windows NT 6.0')!=-1) T0.CngClass('win6');

if (navigator.userAgent.indexOf('Windows NT 6.1')!=-1 && navigator.userAgent.indexOf('WOW64')!=-1 + (navigator.userAgent.indexOf('Win64')!=-1)) T0.CngClass('win7-64');
else if (navigator.userAgent.indexOf('Windows NT 6.1')!=-1) T0.CngClass('win7');

if (navigator.userAgent.indexOf('Windows NT 6.2')!=-1 && navigator.userAgent.indexOf('WOW64')!=-1 + (navigator.userAgent.indexOf('Win64')!=-1)) T0.CngClass('win8-64');
else if (navigator.userAgent.indexOf('Windows NT 6.2')!=-1) T0.CngClass('win8');
">

На XP и 8 не проверял, но если на 7 и Vista работает (в IE всех битностей), то значит и там должно.

Ещё раз огромное спасибо, Sitealert!

S
На сайте с 30.09.2016
Offline
469
#5

Попробуйте всё-таки как-то по-другому написать. Так неправильно. Не надо там ничего плюсовать.

ДП
На сайте с 23.11.2009
Offline
203
#6
StarMaster:
На примере одной строки покажите куда скобки добавить, а то справа добавил (как в вашем примере), а слева не знаю куда :)

А слева и не надо. В скобки надо только выражение которым "или" (||) делается. И так во всех строках.

SM
На сайте с 11.11.2014
Offline
18
#7
Sitealert:
Попробуйте всё-таки как-то по-другому написать. Так неправильно. Не надо там ничего плюсовать.

В общем, если + заменить на ||, то опять выдаёт пакет для Win8 64-bit, то есть опять неполадки.

И скобки тоже нужны, без них не работает даже с знаком +.

Последовательность в строках и внутри строк именно такая, как я вписал, иначе не работает.

P.S.

В JS, как я уже сказал, не разбираюсь, просто молился про себя, чтобы всё заработало, и да, всё заработало. Не без вашей помощи )

S
На сайте с 30.09.2016
Offline
469
#8

Со скобками, условными операторами - можете творить на свой вкус. А вот плюс - это либо оператор сложения, либо оператор конкатенации, - его с логическими операторами не надо перемешивать, иначе результат получается труднопредсказуемый. То есть если получилось, то по стечению обстоятельств. Но такой код считается грязным.

SM
На сайте с 11.11.2014
Offline
18
#9
Sitealert:
Со скобками, условными операторами - можете творить на свой вкус. А вот плюс - это либо оператор сложения, либо оператор конкатенации, - его с логическими операторами не надо перемешивать, иначе результат получается труднопредсказуемый. То есть если получилось, то по стечению обстоятельств. Но такой код считается грязным.

Скопировал ваш пример (что без знака +), вставил для всех систем, и тоже отлично работает!

P.S.

Посоветуйте книгу, по которой обучались JS :)

S
На сайте с 30.09.2016
Offline
469
#10

Не, я не по книгам... Всё в интернете... Начинал когда-то с javascript.ru - а потом где только можно, по мере возникновения вопросов.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий