#javascript #prototype
#javascript #прототип
Вопрос:
Я хочу удалить из текста опции элементы, заключенные в двойные скобки, и поместить внутренний текст в двойные скобки и создать класс в каждой опции со значением. Как бы вы сделали это в Prototype?
<select id="attribute969">
<option value="">Choose an Option...</option>
<option value="340">White [[white]]</option>
<option value="341">White [[white]]</option>
<option value="342">Blue PMS 801 [[pms801]]</option>
<option value="343">Blue PMS 801 [[pms801]]</option>
</select>
Пример ниже:
<select id="attribute969">
<option value="">Choose an Option...</option>
<option value="340" class="white">White</option>
<option value="341" class="white">White</option>
<option value="342" class="pms801">Blue PMS 801</option>
<option value="343" class="pms801">Blue PMS 801</option>
</select>
Ответ №1:
(function() {
var bracketregex = /[[(.*)]]/m,
oBracks;
$$("#attribute969 option").each(function(option) {
oBracks = bracketregex.exec(option.innerHTML);
if (oBracks) {
option.addClassName(oBracks[1]);
option.innerHTML = option.innerHTML.gsub(oBracks[0],"")
}
})
}())
Возможно, потребуется некоторая доработка регулярного выражения, но это должно делать то, что вы хотите.
Ответ №2:
//Here is my brief and killer trial, the way to do it with Prototype's Power!
$A($('attribute969').options).each(function(s,index)
{
$(s).toggleClassName($(s).innerHTML.gsub(/.*[{2}/,'').gsub(/]{2}.*/,''));
$(s).innerHTML = $(s).innerHTML.gsub(/[{2}.*/,'');
});
Проверьте этот фрагмент кода в действии здесь …
Комментарии:
1. mcnemesis: предполагается ли, что эта строка удаляет заключенное в квадратные скобки значение из текста параметра?
$(s).innerHTML = $(s).innerHTML.gsub(/[{2}.*/,'');
2. Я поиграл с вашим примером jsfiddle и вижу, что он удаляет [[pms801]] из опции, но в моем коде точно такой же код не удаляет текст, заключенный в квадратные скобки. Я использую версию prototype 1.6.0.3. Как вы думаете, это играет роль в этой проблеме?
3. да, он удаляет все от
[[
до конца строки, затем устанавливает остаток в качестве нового параметра text / innerHTML.4. да, версия прототипа, которую я использовал для тестирования, была 1.7. смотрите подробную скрипку здесь, вы можете переделать ее с помощью 1.6 — jsfiddle.net/mcnemesis/VW58q
5. аааа, я вижу, чего мне не хватало… документ.обратите внимание на «dom: загружен»
Ответ №3:
Непроверенный, но вы поняли идею…
$('attributes969').childElements().each(
function(option) {
if (/[[(.*?)]]/.test(option.innerHTML)) {
option.addClassName(option.match(/[[(.*?)]]/)[1]);
option.update(option.innerHTML.replace(/[[(.*?)]]/, ''));
}
}
);
Ответ №4:
вы можете использовать регулярное выражение для извлечения [[содержимого ]]. Я использую нестандартное выражение .*? чтобы получить содержимое. Шаблон генерирует три группы со значением индекса 0,1,2, где индекс 2 — это класс, индекс 0 — это значение, а 1 — текстовое содержимое между и . Используя группы, вы можете восстановить содержимое значения параметра.
data="""<select id="attribute969">
<option value="">Choose an Option...</option>
<option value="340">White [[white]]</option>
<option value="341">White [[white]]</option>
<option value="342">Blue PMS 801 [[pms801]]</option>
<option value="343">Blue PMS 801 [[pms801]]</option>
</select>"""
options = re.findall(r'<option value="(w*)">(.*?([[.*?]])*)</option>',data)
for option in options:
opt_value=option[0]
opt_content=re.sub(r'([[.*?]])*','',option[1])
opt_class=option[2].replace('[','').replace(']','')
if len(opt_class)>0:
print("<option value='{opt_value}' class='{opt_class}'>{opt_content}</option>".format(opt_value=opt_value,opt_class=opt_class,opt_content=opt_content))
else:
print("<option value='{opt_value}'>{opt_content}</option>".format(opt_value=opt_value,opt_content=opt_content))
вывод
<option value=''>Choose an Option...</option>
<option value='340' class='white'>White </option>
<option value='341' class='white'>White </option>
<option value='342' class='pms801'>Blue PMS 801 </option>
<option value='343' class='pms801'>Blue PMS 801 </option>