Во-первых, быстрый способ выполнить то, что вы хотите: измените атрибут onChange виджета на просто updateResults
(без скобок).Это означает, что он обрабатывается как указатель на функцию и что функция будет вызываться с любыми аргументами, которые ColorPalette решит предоставить.
<div dojoType="dijit.ColorPalette" onChange="updateResults"
palette="7x10" id="colorPalette"></div>
Во-вторых, измените вашу функцию updateResults
, чтобы она принимала аргумент.ColorPalette предоставит своему событию onChange строковый аргумент, содержащий шестнадцатеричное значение выбранного цвета.
function updateResults(selectedColor)
{
// Now you can remove a lot of the stuff that you had here, and simply do:
var objResultTextArea = dijit.byId("results");
objResultTextArea.set("value", output.replace("&Color", selectedColor));
}
Теперь, когда это не так, почему ваш оригинальный подход не сработал?На самом деле, это вроде как.Во второй раз, когда вы выбираете цвет, он вводит предложение else, но он не будет работать на toHex
, потому что objColor
была строкой, а не объектом Color.
Но почему он не работал напервый клик?Кажется, причина в том, что функция onChange
выполняется до того, как ColorPalette фактически установит свое внутреннее «значение».Я предполагаю, что где-то задействован setTimeout.Таким образом, objColorPalette.value
будет нулевым в этой точке (использование attr, или, вернее, get
- правильный путь между прочим;)).Во второй раз, когда событие сработало, значением будет фактически выбранный ранее цвет, а не новый (но toHex, конечно, все равно не будет работать, поэтому текст в поле результатов останется прежним).
Надеюсьэто помогает.