Прежде всего, прекратите использовать alert
для выполнения отладки! Возьмите копию Firebug и FireQuery и используйте вместо нее console.log()
. Даже если вы работаете с alert()
, вам действительно следует использовать $("input[type='date']").length
, чтобы найти, вернул ли селектор что-либо - object [object]
не говорит вам ничего полезного здесь.
Гораздо лучший метод определения поддерживаемых типов ввода - просто создать элемент ввода и пройтись по всем доступным типам ввода и проверить, если type
меняет палочки:
var supported = { date: false, number: false, time: false, month: false, week: false },
tester = document.createElement('input');
for (var i in supported){
try {
tester.type = i;
if (tester.type === i){
supported[i] = true;
}
} catch (e) {
// IE raises an exception if you try to set the type to
// an invalid value, so we just swallow the error
}
}
Это фактически использует тот факт, что браузеры, которые не поддерживают этот конкретный тип ввода, будут использовать текст, что позволит вам проверить, поддерживаются они или нет.
Затем вы можете использовать supported['week']
, например, чтобы проверить доступность типа ввода week
, и выполнить ваши откаты через это. Посмотрите простую демонстрацию этого здесь: http://www.jsfiddle.net/yijiang/r5Wsa/2/. Вы также можете рассмотреть возможность использования Modernizr для более надежного определения функций HTML5.
И, наконец, лучший способ получить outerHTML
- верить или нет, использовать outerHTML
. Вместо
var inputAttr = $('<div>').append($(this).clone()).remove().html().toLowerCase();
Почему бы просто не использовать:
var inputAttr = this.outerHTML || new XMLSerializer().serializeToString(this);
(Да, как вы можете видеть, есть предостережение - outerHTML
не поддерживается Firefox, поэтому нам понадобится простой обходной путь, начиная с этого вопроса переполнения стека ).
Редактировать: На этой странице нашел метод для тестирования поддержки пользовательского интерфейса в виде форм: http://miketaylr.com/code/html5-forms-ui-support.html. Браузеры, которые каким-то образом поддерживают пользовательский интерфейс для этих типов должны также предотвращает ввод недопустимых значений в эти поля, поэтому логическое расширение теста, который мы делаем выше, будет таким:
var supported = {date: false, number: false, time: false, month: false, week: false},
tester = document.createElement('input');
for(var i in supported){
tester.type = i;
tester.value = ':(';
if(tester.type === i && tester.value === ''){
supported[i] = true;
}
}
Опять же, не на 100% надежно - это хорошо только для типов, которые имеют определенные ограничения по своим значениям, и определенно не очень хорошо, но это шаг в правильном направлении, и, безусловно, решит вашу проблему сейчас.
Смотрите обновленную демонстрацию здесь: http://www.jsfiddle.net/yijiang/r5Wsa/3/