Функция Javascript не вызывается onClick () - PullRequest
0 голосов
/ 27 февраля 2011

Я пытался очистить часть кода на нашем веб-сайте (в его нынешнем виде нам нужно было бы сделать около 50 файлов JS и около 50 файлов PHP для всех предлагаемых нами продуктов). Я смотрю на код, и он ДОЛЖЕН работать, поэтому я не понимаю, где я облажался. Не похоже, что функция вызывается вообще (я поставил Alert вверху, который никогда не вызывался), поэтому я предполагаю, что я что-то напортачил в первом разделе.

                <select class="gameserverselecion4" name="slots">
                    <option value="10|457">10 Slots - 9.90 / mo</option>
                    <option value="12|458">12 Slots - 11.88 / mo</option>
                    <option value="14|459">14 Slots - 13.86 / mo</option>
                <option value="16|460">16 Slots - 15.84 / mo</option>
                    <option value="18|461">18 Slots - 17.82 / mo</option>
                    <option value="20|462">20 Slots - 19.80 / mo</option>
                    <option value="22|463">22 Slots - 21.78 / mo</option>
                    <option value="24|464">24 Slots - 23.76 / mo</option>
                    <option value="26|465">26 Slots - 25.74 / mo</option>
                    <option value="28|466">28 Slots - 27.72 / mo</option>
                    <option value="30|467">30 Slots - 29.70 / mo</option>
                    <option value="32468">32 Slots - 31.68 / mo</option>
            </select>
            </div>
            <div id="inputTopRight">
                <input type="button" name="submit" onclick="ProcessOrder('0','167','44');"/>
            </div>

Тогда Javascript ...

function ProcessOrder(loc,pid,cfopID)
{
    var values = document.dropTop.slots.value;
    var valuesArray = values.split("|");
    var slots = valuesArray[0];
    var cfopValue = valuesArray[1];
    alert("Slots is: " + slots " cfopValue is:" + cfopValue);

    switch (slots)
    {
        case 10:
        {
            window.location = "https://www.xfactorservers.com/clients/cart.php?a=add&pid=" + pid + "&configoption[" + cfopID + "]=" + cfopValue;
        }
        case 12:
        {
            window.location = "https://www.xfactorservers.com/clients/cart.php?a=add&pid=" + pid + "&configoption[" + cfopID + "]=" + cfopValue;
        }

Ответы [ 2 ]

8 голосов
/ 27 февраля 2011

В вашем коде есть несколько проблем.

Проблемы с синтаксисом

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

Обновление (21 июля 2015 г.): Как указано в комментариях, все должно быть хорошо вэтот случай, поскольку возвращение литерала объекта отличается от крайнего случая.Я все же предпочитаю поставить скобку на той же линии, чтобы быть в безопасности.

Поэтому вместо этого:

function sayHello()
{
    alert('Hello, world!');
}

Вы должны сделатьэто:

function sayHello() {
    alert('Hello, world!');
}

2. Вы не должны использовать скобки вокруг чехлов.Вместо этого заканчивайте их операторами break.

Обновление (21 июля 2015 г.): Использование скобок - это нормально, но они не заменяют break.Если вы не используете его, он «провалится» в следующий случай после выполнения этого конкретного случая.

Неправильно:

switch (number) {
    case 4: {
        doSomething();
    }
    case 9: {
        doSomething();
    }
}

Исправить:

switch (number) {
    case 4:
        doSomething();
        break;
    case 9:
        doSomething();
        break;
}

3. Оператор switch и функция не закрыты.

4. В этой строке есть синтаксическая ошибка.

alert("Slots is: " + slots " cfopValue is:" + cfopValue);
//                         ^---here

Это правильный синтаксис:

alert("Slots is: " + slots + " cfopvalue is:" + cfopvalue);

Проблемы стилей

1. Вы можете комбинировать несколько операторов var.

Вместо этого:

var a = 'foo';
var b = 'bar';
var c = 'baz';

Вы можете сделать это:

var a = 'foo',
    b = 'bar',
    c = 'baz';

2. Вы можете объединять несколько случаев в операторах switch.

switch (number) {
    case 3:
    case 12:
        doSomething();
        break;
}

3.

alert("Slots is: " + slots + " cfopvalue is:" + cfopvalue);

Это покажет что-то вроде этого:

Слоты: 10 cfopvalue: 20

Вы можете вставить разрыв строки (\n), чтобы он выглядел лучше:

alert("slots is: " + slots + "\n" + "cfopvalue is: " + cfopvalue);

Слотов: 10cfopvalue: 20

4. Храните содержимое, стили и сценарии отдельно.Поэтому вместо использования встроенных обработчиков событий лучше настроить обработчики событий в своем коде JS, например:

function addEvent(element, eventType, eventHandler) {
    if (window.addEventListener) {
        element.addEventListener(eventType, eventHandler, false);
    } else {
        element.attachEvent('on' + eventType, eventHandler);
    }
}

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

addEvent(document.getElementsByName('submit'), 'click', function() {
    ProcessOrder('0', '167', '44');
});

Вы также можете использовать библиотекукак jQuery [документы] .Это упростит задачу.

Обновление (21 июля 2015 г.): Библиотеки, такие как jQuery, являются полезным инструментом, но вы не должны полностью полагаться на них.Также важно знать «ванильный» JavaScript.

jQuery обрабатывает кросс-браузерные несовместимости и использует селекторы CSS для выбора элементов.Для справки, вот как вы могли бы написать приведенный выше код обработчика событий с помощью jQuery:

$('[name="submit"]').click(function () {
    ProcessOrder('0', '167', '44');
});
1 голос
/ 27 февраля 2011

В этой строке есть синтаксическая ошибка:

alert("Slots is: " + slots " cfopValue is:" + cfopValue);
//                         ^-- here

... вероятно, поэтому вы не видите предупреждение. Если вы исправите это, вы можете обнаружить, что функция вызывается (так как синтаксическая ошибка, описанная выше, не позволяет определить ее).

Как только вы дойдете до точки вызова функции, у вас все еще будет (не связанная) проблема: у вас неверный синтаксис вашего оператора switch, хотя в довольно безвредный способ, если вы действительно хочу, чтобы все условия провалились друг в друга. Отдельные case s не заключены в фигурные скобки, те, которые у вас есть, полностью игнорируются парсером. Вы завершаете case с помощью break, поэтому:

switch (slots)
{
    case 10:
        window.location = "https://www.xfactorservers.com/clients/cart.php?a=add&pid=" + pid + "&configoption[" + cfopID + "]=" + cfopValue;
        break;

    case 12:
        window.location = "https://www.xfactorservers.com/clients/cart.php?a=add&pid=" + pid + "&configoption[" + cfopID + "]=" + cfopValue;
        break;

    default:
        // do whatever you do if nothing matches (this is optional)
        break;
}

Без перерывов код для каждого case будет переходить к следующему. Так, например, в вашем оригинале, если slots было 10, сначала вы установили бы местоположение окна в случае 10, затем выполнение продолжится с 12 и установите его в другое место и т. д. и т. п.


Не по теме : Вы можете выделить лот общности в этой функции; Пример:

function ProcessOrder(loc,pid,cfopID)
{
    var values = document.dropTop.slots.value;
    var valuesArray = values.split("|");
    var slots = valuesArray[0];
    var cfopValue = valuesArray[1];
    var destinationMap = {
            "10": "pid=" + pid + "&configoption[" + cfopID + "]=" + cfopValue,
            "12": "pid=" + pid + "&configoption[" + cfopID + "]=" + cfopValue,
            "14": "pid=167&configoption[44]=459",
            "16": "pid=167&configoption[44]=460",
            "18": "pid=167&configoption[44]=461",
            "20": "pid=167&configoption[44]=462",
            "22": "pid=167&configoption[44]=463",
            "24": "pid=167&configoption[44]=464",
            "26": "pid=167&configoption[44]=465",
            "28": "pid=167&configoption[44]=466",
            "30": "pid=167&configoption[44]=467",
            "32": "pid=167&configoption[44]=468"
        };
    var dest = destinationMap[slots];
    if (dest) {
        window.location = "https://www.xfactorservers.com/clients/cart.php?a=add&" + dest;
    }
    else {
        // Do whatever you should do if `slots` isn't a value you recognize
    }
}

(я оставил pid= в каждой строке, потому что мне показалось, что это помогло с контекстом.)

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