Alright. I've got per-row done; I'll throw together the other way after this.
Start by placing a checkbox-type select question immediately following the semantic diff. The select needs the same list as the sem diff's left or right list. You can give it this code to keep it hidden from respondents:
<style>
#[% QuestionName() %]_div {
display: none;
}
</style>
Now give the semantic diff this code:
<script>
$(document).ready(function(){
var selectQ = $('#[% QuestionName() %]_div').nextAll('.question.select')[0].id.replace('_div', '');
var list = $('input[name=hid_list_' + selectQ + ']').val().split(',').map(Number);
$('#[% QuestionName() %]_div .column_header_row').append('<td>NONE</td>');
list.forEach(function(item){
$('#' + selectQ + '_' + item).closest('.response_row').find('.option_cell').remove();
$('#[% QuestionName() %]_' + item + '_row').append('<td></td>');
$('#[% QuestionName() %]_' + item + '_row td:last-child').append($('#' + selectQ + '_' + item).closest('.response_row'));
if (SSI_GetValue(selectQ + '_' + item)) {
$('#[% QuestionName() %]_' + item).find('.ui-slider').slider('disable');
}
});
})
function SSI_CustomGraphicalCheckbox(graphicalObj, inputObj, bln) {
var selectQ = $('#[% QuestionName() %]_div').nextAll('.question.select')[0].id.replace('_div', '');
var regex = new RegExp(selectQ + '_([0-9]+)');
var match = inputObj.name.match(regex);
if (match) {
var item = Number(match[1]);
if (bln) {
$('#[% QuestionName() %]_' + item).find('.ui-slider').slider('disable');
$('#[% QuestionName() %]_' + item).find('input').val('');
$('#[% QuestionName() %]_' + item).find('.ui-slider-handle').css('left', '50%');
}
else {
$('#[% QuestionName() %]_' + item).find('.ui-slider').slider('enable');
}
}
}
</script>
If you want to require that the respondent either answers the SD row or checks the checkbox, disable "Require response" in the SD settings and use this custom JavaScript verification:
var selectQ = $('#[% QuestionName() %]_div').nextAll('.question.select')[0].id.replace('_div', '');
var list = $('input[name=hid_list_' + selectQ + ']').val().split(',').map(Number);
list.forEach(function(item){
var sdResp = SSI_GetValue('[% QuestionName() %]_' + item);
var checkResp = SSI_GetValue(selectQ + '_' + item);
if (!sdResp && !checkResp) {
strErrorMessage = 'Error.';
}
})