выполнение ссылки на field.onchange в Firefox - PullRequest
0 голосов
/ 28 августа 2010

У меня есть HTML-код, который вызывает функцию javascript из формы, используя:

<form name="f" id="f" ...>
  <input name="myField" onchange="doFunct(f.myField.value,f.yourField);" />
  <input name="yourfield" onchange="doFunct(f.yourField.value,f.anotherField);" />
...

В коде JavaScript:

function doFunct(field,dest){
    // do something with field
    dest.value = field;
    // see if the dest has a change field
    if (dest.onchange !== null) {
        //we have an onchange function, so let's do it!
        dest.onchange();
    }
}

Это прекрасно работает в Safari, Opera и Chrome. Сбой в FireFox с ошибкой:

Ошибка: dest.onchange не является функцией

Любые предложения о том, как выполнить "dest.onchange ()" из JavaScript в FireFox?

Мне нужна эта возможность для каскадного изменения полей в форме ввода.

Ответы [ 2 ]

0 голосов
/ 28 августа 2010

Как видно из дальнейших исследований, в моем O'Reilly JavaScript Pocket Reference я обнаружил, что есть параграф, в котором говорится:

null ( и не определено )

Ключевое слово JavaScript null - это специальное значение, которое указывает «нет значения». Если переменная содержит null, вы знаете, что она не содержит допустимого значения любого типа. В JavaScript есть еще одно специальное значение: неопределенное значение. Это значение, возвращаемое при использовании необъявленной или неинициализированной переменной или при использовании несуществующего свойства объекта. Нет ключевого слова JavaScript для этого значения.

После некоторого тестирования с предупреждением (dest.onchange) я обнаружил, что Firefox не жаловался на каждый вызов dest.onchange(), а только те, которые были ошибками ( undefined ). Очевидно (Grrrr!) Firefox не получил памятку: [ Нет ключевого слова JavaScript для этого значения. ]

Если я изменю свой код для проверки на dest.onchange !== undefined, тогда Firefox будет доволен, но Safari, Opera и Chrome FAIL на тесте. Если я изменю код, как показано ниже, он будет работать во всех четырех браузерах.

if ( (dest.onchange !== null)                // test for safari, chrome, opera
     && (dest.onchange !== undefined) ) {    // test for firefox
    //we have an onchange function, so let's do it!
    dest.onchange();
}

И мне пришлось потратить 8 часов, пытаясь понять, почему Firefox не играет хорошо.

0 голосов
/ 28 августа 2010

Чтобы выполнить события, не добавляйте к нему префикс «on», просто запустите dest.change();

...