jQuery val() & change() tricks
Oct 24 2009Пачаў паціху ажываць блёг, як вы ўжо, напэўна, заўважылі :) Практыка праграмаваньня і далейшага рэфакторынгу добрага коду дае сваю добрую садавіну й гародніну. Благі код і ягонае суправаджэньне такой радасьці не прынясуць, асабліва калі працаваць аднаму. На гэта раз пра jQuery, WYSIWYG і onChange event.
Так ужо здарыласа, што спатрэбілася мне дадаць у нейкі абстрактны праект у вакууме WYSIWYG рэдактар да некаторых textarea элементаў. Больш ня буду слухаць парад ад датнэтчыкаў, ідэя з CKEDITOR атрымалася ня дужа жыццяздольнай, так што я пераключыўся на варыянт з tinyMCE. Ня тое, каб першы быў ужо зусім благі, але проста ў нас неяк не зраслося. Ды й дакумэнтацыі па яму ня надта круцейшая дакумэнтацыі да bbPress.
Акрамя простага рэдагаваньня тэксту трэба ў рэдактары дынамічна падмяняць дадзеныя тымі, якія былі атрыманы ад сэрвера праз Ajax. Тут усплывае некалькі праблемаў. Першая — пры простым зьмяненьні дадзеных нейкага textarea праз
$("#some_id").val()
дадзеныя ў WYSIWYG не аднаўляюцца. Тая ж сітуацыя і з іншымі палямі, якія зьмяняюцца праз мэтад val(). jQuery дазваляе нам самім выклікаць некаторыя эвэнты для элементаў, чым мы і скарыстаемся. Выклікаць падобны мэтад пасьля кожнага val() было б ня дужа прыгожа, праўда? Вось і я так лічу, так што мы трошкі пашырым наш jQuery наступным чынам:
$(document).ready(function()
{
$.fn.extend({
// fires change() event on element
valChange: function(newValue)
{
var obj = $(this);
obj.val(newValue);
obj.change();
}
});
});
Салюшн прыкладна такі ж, як і тут, з той толькі розьніцай, што я не спасьціг javascript на ўзроўні разуменьня такога роду канструкцый, як па спасылцы прыведзены. Такім чынампры кожным выкліку valChange замест val у нас будуць спрацоўваць выклік change эвэнта і ўсе ягоныя апрацоўшчыкі. Вельмі карысна, калі ў вас, напрыклад, вісіць апрацоўшчык для text input, які аднаўляе дату ў календары пры зьмене дадзеных у полі.
Такое ж дзеяньне мы вешаем на зьмену textarea за нашым tinymce. Толькі вось зноў праблема, што ён усё роўна не аднаўляецца, бо адпаведны эвэнт не слухаецца праз tinyMCE. Каб зрабіць наш чароўны код працуючым і нязломным у экстрэмальных выпадках, дададзім падобнага слухача наступным чынам:
$('textarea').change(function()
{
if (tinyMCE)
{
tinyMCE.get(this.id).setContent(this.value);
}
});
Так у нас нічога не зламаецца, нават калі WYSIWYG не загрузіцца па нейкіх прычынах.
Ну і напасьледак невялічкая парада, на выпадак таго, што ў вас у базе дадзеных могуць быць палі са значэньнем NULL, якія таксама трэба выцягваць у форму. Можна замяняць null на баку сэрвера, але па прынцыпе «працуе — не чапай» мы ня будзем чапаць сэрверныя мадэлі працы з БД, а напішам невялічкую функцыі на Javascript:
function sanitizeNull(data)
{
// to make some NULL sql fields just like empty strings
for (x in data)
{
if (data[x] == null)
{
data[x] = '';
}
}
}
Проста скармліваем ёй JSON, атрыманы ад сэрвера, і ўсе null стануць пустымі радкамі, што важна, каб браўзэры ціпа Opera не выстаўлялі ў нашыя textarea слова null адкрытым тэкстам. Вось неяк так.
Спортивное питание — креатин, dynamize и другое




Recent Comments