Unobstrusive KOjs binding provider

by g

HTML

<script src="https://github.com/downloads/SteveSanderson/knockout/knockout-1.3.0beta.js"></script>
<div>
    <input id="name" type="text" />
</div>

<ul id="items">
    <li><span class="id"></span> - <span class="name"></span></li>
</ul>

<!-- comment test -->

JavaScript

var viewModel = {
    name: ko.observable('test'),
    items: ko.observableArray([
        { id: 0, name: 'Windows' },
        { id: 1, name: 'Linux' },
        { id: 2, name: 'MacOS' }
    ])
};

var bindings = {
    '#name': { 
        value: viewModel.name 
    },
    '#items': { 
        foreach: viewModel.items
    },
    '#items span.name': { 
        _text: function(context){ return this.name + ' : ' + context.$parent.name(); }, // Template context
        click: function(){
            alert(this.name);    
        }
    },
    '#items span.id': "text: id" // Default binding parser
}
    
ko.unobstrusiveBindingProvider = function(allBindings) {
    this.allBindings = allBindings;
    this.defaultProvider = new ko.bindingProvider();
    
    var selectors = [];
    
    for(var selector in allBindings)
    {
        selectors.push(selector);
    }
    
    this.allSelectors = selectors.join(', ');
    
    this.nodeHasBindings = function(node) {
        if(node.nodeType != 1) { return false; }
        return $(node).is(this.allSelectors);
    };
    
    this.parseBindings = function(bindings, bindingContext)
    {
        var parsedBindings = { };
        for(var bindingName in bindings)
        {
            var binding = bindings[bindingName];   
            // Call bindings starting with _ with the bindingContext as first parameter
            if(typeof(binding) === 'function' && bindingName.indexOf('_') == 0) {
                parsedBindings[bindingName.slice(1)] = binding.call(bindingContext.$data, bindingContext);
            } else if(typeof(binding) === 'object') {
                parsedBindings[bindingName] = this.parseBindings(bindings[bindingName], bindingContext);
            } else {
                parsedBindings[bindingName] = binding;
            }
        }
        return parsedBindings;
    };
    
    this.findBindings = function(node, bindingContext) {
        var $el = $(node);
        var bindings = { };
        for(var selector in...