Ответ 1
Причина проблемы в разнице в реализации функции isPlainObject
в этих двух версиях jQuery.
Текущий isPlainObject в 1.4 тестах .nodeType, потому что IE делает dom-узлы похожими на объекты. Это имеет побочный эффект: $.isPlainObject({nodeType:...}); вернет false, когда он вернет true. (Из jQuery Forum)
Использовать jQuery 1.11.2
var data = {
colors: {
id: 1,
color: "red",
nodeType: function () {},
}
};
function logPlain (value, log) {
value && value.color == "red" && $('#plain').text(log);
}
//from release of jQuery UI-1.12.1
$.widget.extend = function( target ) {
var widgetSlice = Array.prototype.slice;
var input = widgetSlice.call( arguments, 1 );
var inputIndex = 0;
var inputLength = input.length;
var key;
var value;
for ( ; inputIndex < inputLength; inputIndex++ ) {
for ( key in input[ inputIndex ] ) {
value = input[ inputIndex ][ key ];
if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
// Clone objects
if ( $.isPlainObject( value ) ) {
logPlain(value, 'true');
target[ key ] = $.isPlainObject( target[ key ] ) ?
$.widget.extend( {}, target[ key ], value ) :
// Don't extend strings, arrays, etc. with objects
$.widget.extend( {}, value );
// Copy everything else by reference
} else {
logPlain(value, 'false');
target[ key ] = value;
}
}
}
}
return target;
};
$(function() {
$.widget("custom.widget2", {
options: {
data: null
},
_create: function() {
var isDataEqual = this.options.data == data.colors;
$('#equal').text(isDataEqual ? "true" : "false");
},
});
$("#my-widget1").widget2({
data: data.colors
});
});
#equal, #plain {
background-color: rgba(0, 128, 0, 0.31);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<div>
<div id="my-widget1">Testing 'nodeType' in jQuery version-1.11.2</div>
<div>isPlainObject: <span id="plain"></div>
<div>isDataEqual: <span id="equal"></span></div>
</div>