问题描述: 使用laravelcollective / html组件时,我遇到了laravel转义引号的问题。我需要引号保持未转义状态,以保持javascript代码正常工作。
代码的批准: 用户需要指示何时将表单字段保持为空。如果他们不这样做,则需要一些输入。我不希望用户指示字段为空并且他同时提交了一些输入。此行为由javascript控制,方法是在点击单选按钮时删除复选框的已检查状态,反之亦然。
表单中有多个字段(每个字段都有单选按钮,如果字段应为空,则为复选框)。在提交表单之前必须通过javascript检查所有内容。每个字段都有自己的名称。
字段的刀片代码:
<div>
{!! Form::checkbox('field_empty',1,null, ['id' => 'field_empty'] !!}
</div>
<div>
{!! Form::radio('field', 0, null, ['onClick' => 'unselectCheckbox(this,'field_empty')'] !!}
{!! Form::radio('field', 1, null, ['onClick' => 'unselectCheckbox(this,'field_empty')'] !!}
{!! Form::radio('field', 2, null, ['onClick' => 'unselectCheckbox(this,'field_empty')'] !!}
</div>
javascript代码:
function unselectCheckbox(box,field)
{
if (box.value >= 0)
{
document.getElementsById(field).checked = false;
}
}
(我还有一个javascript函数,用于在单击复选框时删除选中的单选按钮,但我没有在代码中包含它。)
使用上面的代码时,由于'field_empty'周围的单引号,我得到了一个laravel错误。删除单引号不会导致工作js。使用双引号会在生成的html中生成“”。
当然我可以使用普通的html代替刀片 - 所以阻止使用{!! !!}标签 - ,但我想知道是否可以在刀片中执行此操作,或者可能在javascript中使用其他方法?
修改 我的表单包含多个必须检查的项目。每个项目都有自己的名称,并带有相应的复选框以确认空值:
<div>
{!! Form::checkbox('field1_empty', 1, null, ['id' => 'field_empty']) !!}
</div>
<div>
{!! Form::radio('field1', 0, null) !!}
{!! Form::radio('field1', 1, null) !!}
{!! Form::radio('field1', 2, null) !!}
</div>
<div>
{!! Form::checkbox('field2_empty', 1, null, ['id' => 'field_empty']) !!}
</div>
<div>
{!! Form::radio('field2', 0, null) !!}
{!! Form::radio('field2', 1, null) !!}
{!! Form::radio('field2', 2, null) !!}
</div>
<div>
{!! Form::checkbox('field3_empty', 1, null, ['id' => 'field_empty']) !!}
</div>
<div>
{!! Form::radio('field3', 0, null) !!}
{!! Form::radio('field3', 1, null) !!}
{!! Form::radio('field3', 2, null) !!}
</div>
答案 0 :(得分:3)
可以通过将属性值作为HtmlString
实例传递来转义属性值,该实例不会被转义。
{!! Form::radio('field', 0, null, ['onClick' => new Illuminate\Support\HtmlString("unselectCheckbox(this,'field_empty')")]) !!}
话虽如此,在元素上内联定义onclick
事件通常被认为是个坏主意。您应该改为处理JavaScript方面的事件,因此您不必在元素定义中包含onClick
属性。所以HTML应该是这样的:
<div>
{!! Form::checkbox('field_empty', 1, null, ['id' => 'field_empty']) !!}
</div>
<div>
{!! Form::radio('field', 0, null) !!}
{!! Form::radio('field', 1, null) !!}
{!! Form::radio('field', 2, null) !!}
</div>
处理它的JavaScript应如下所示:
(function () {
var empty = document.getElementById('field_empty');
var radios = document.getElementsByName('field');
// When clicking on any of the radio buttons, uncheck the field_empty checkbox
for (var i = 0; i < radios.length; i++) {
radios[i].onclick = function () {
// The "if (box.value >= 0)" condition is useless here
// because it will always be true, so I removed it
empty.checked = false;
};
}
// When clicking on the empty checkbox, uncheck the radio buttons
empty.onclick = function () {
for (var i = 0; i < radios.length; i++) {
radios[i].checked = false;
}
};
})();
以上是上面代码的working example。如您所见,不需要像unselectCheckbox
这样的外部函数,因为所有逻辑都在事件函数中处理。
还有jQuery版本比vanilla JS版本更短,更易读:
(function () {
var empty = $('#field_empty');
var radios = $('[name=field]');
radios.click(function () {
empty.prop('checked', false);
});
empty.click(function () {
radios.prop('checked', false);
});
})();
这是jQuery版本的working example。