If your selection list is the same, you can set to disable their index:
$(document).ready(function () {
var $select = $('.d1, .d2, .d3, .d4').change(function () {
$select.find('option').prop('disabled', false);
$select.each(function(){
var $this = $(this), index = $this.find(':selected').index();
$select.not(this).find('option:nth-child('+ (index+1) +')').prop('disabled', true);
})
});
});
Fiddle: http://jsfiddle.net/u6eCL/16/
Otherwise, here is code based on the text:
$(document).ready(function () {
var $select = $('.d1, .d2, .d3, .d4').change(function () {
$select.find('option').prop('disabled', false);
$select.each(function(){
var $this = $(this), text = $this.find(':selected').text();
$select.not(this).find('option').filter(function(){
return $(this).text() === text
}).prop('disabled', true);
})
});
});
http://jsfiddle.net/u6eCL/15/