Я считаю, что проблема с HTML, который не работает, как в вашем примере AWeber, заключается в том, что он не содержится в одном родительском элементе верхнего уровня, что означает, что при его анализе для создания arcode
jQuery-объекта Объект содержит элемент <form>
в качестве элемента верхнего уровня. Это, в свою очередь, означает, что метод .find()
, который ищет дочерние элементы, не находит ничего, поскольку нет дополнительных элементов <form>
, которые являются дочерними. (Вы можете проверить это самостоятельно, проверив arcode.length
или используя arcode.each()
, чтобы зарегистрировать тэги элементов в arcode
.)
Ваш пример, который работал, оказался в верхнем уровне <div>
, поэтому у него не было этой проблемы.
Итак, мое предлагаемое исправление для этого - просто обернуть введенный html в элемент <div>
, чтобы все работало с .find()
. А затем упростите вашу функцию, поскольку следующая короткая версия делает все то же, что и ваша оригинальная функция:
$j( '#jwsqz_autocode' ).blur( function() {
var thehtml = "<div>" + $j( this ).val() + "</div>";
var arcode = $j( thehtml );
$j('#jwsqz_autoformurl').val( arcode.find('form').attr('action') );
$j('#jwsqz_arnameinput').val(
arcode.find('input[type="text"][name*="name"]').attr('name') );
$j('#jwsqz_aremailinput').val(
arcode.find('input[type="text"][name*="email"]').attr('name') );
var hiddens = "";
arcode.find( 'input[type="hidden"]' ).each( function() {
hiddens += $j( this ).prop( 'outerHTML' ) + "\n";
});
$j( '#jwsqz_autohidden' ).val( hiddens );
});
Рабочая демоверсия: http://jsfiddle.net/fpK9F/6/ (похоже, справляется с вашими примерами).
Вы заметите, что я использовал атрибут jQuery, содержащий селектор с [name*="email"]
.
Обратите внимание, что если тесты, подобные приведенным в вашем коде, являются избыточными:
if( hiddens != '' )
$j( '#jwsqz_autohidden' ).val( hiddens );
else
$j( '#jwsqz_autohidden' ).val( '' );
В случае else
вы в любом случае устанавливаете значение, которое было в переменной hiddens
, поэтому вы можете заменить всю структуру только частью из if
- как я делал в моем коде выше.
ОБНОВЛЕНИЕ: Для нечувствительного к регистру теста значения атрибута name
вы можете сделать это:
$j('#jwsqz_aremailinput').val(
arcode.find('input[type="text"]')
.filter(function(){ return /email/i.test(this.name); })
.attr('name') );
(Вы не должны использовать регулярное выражение, ключевой точкой является функция .filter()
.)
Демонстрация без учета регистра: http://jsfiddle.net/fpK9F/7/